【问题标题】:SQL Select Vs Binary SearchSQL 选择与二进制搜索
【发布时间】:2015-12-29 04:53:16
【问题描述】:

只是为了记录我要添加的未来问题 将数据提取到datagridview,我知道代码远非水晶般清晰,只是为了理解这个主题的属性。

    CreateDataTable(Me.t, "SELECT * FROM tblContacts", "tblContacts")
    CreateDataTable(Me.t2, "SELECT * FROM ContactsData", "ContactsData")

    Dim joined = From row1 In t.AsEnumerable()
                   Join row2 In t2.AsEnumerable()
                   On row1.Field(Of Int32)("ID") Equals row2.Field(Of Int32)("ID")
                   Select BothRows = New With {row1, row2}






    With DataGridView1
        .Columns.Clear()
        .Rows.Clear()
        ' add columns of tblContacts table
        For i = 0 To joined.AsEnumerable.First.row1.Table.Columns.Count - 1
            .Columns.Add(joined.AsEnumerable.First.row1.Table.Columns(i).ColumnName.ToString, joined.AsEnumerable.First.row1.Table.Columns(i).ColumnName.ToString)
        Next
        ' add columns of ContactsData table
        For i = 0 To joined.AsEnumerable.First.row2.Table.Columns.Count - 1
            .Columns.Add(joined.AsEnumerable.First.row2.Table.Columns(i).ColumnName.ToString, joined.AsEnumerable.First.row2.Table.Columns(i).ColumnName.ToString)
        Next
        ' add rows to datagridview
        .Rows.Add((joined.Count - 1))

    End With

    Dim rownum As Integer = 0
    For Each x In joined

        Dim row1 As DataRow = x.row1
        Dim row2 As DataRow = x.row2

        ' populate data to dgv
        For i = 0 To row1.Table.Columns.Count - 1
            DataGridView1.Rows(rownum).Cells(i).Value = row1.Item(i).ToString
        Next

        For i = row1.Table.Columns.Count To DataGridView1.Columns.Count - 1
            DataGridView1.Rows(rownum).Cells(i).Value = row2.Item(i - row1.Table.Columns.Count).ToString
        Next

        rownum += 1
    Next

经过测试@Tim 的回答如下: 我对 linq to dataset 进行了测试,但出现错误,我不知道为什么.. 错误描述是'值不能为空。参数名称:source' 以防万一我测试了一个常规的 SQL 内连接查询并且它工作正常。

我在 access 中创建了 2 个表,这是这些表

 tblCOntacts
 --------------
 ID FirstName   LastName
 ---------------------------------
 22 John        Smith
 23 Jane        Apple
 24 Jonathan    Tucker


 ContactsData
 --------------
 ID Proffesion  Hoby
 ---------------------------------
 22 Carpenter   Long Runs
 23 Pilot       Gym
 24 Psychologyst    Programming

这是我的代码,我注释了导致错误的行:

 Private Sub Button4_Click(sender As System.Object, e As System.EventArgs)           Handles Button4.Click
     CreateDataTable(Me.t, "SELECT * FROM tblContacts", "tblContacts")
    CreateDataTable(Me.t2, "SELECT * FROM ContactsData", "ContactsData")

   Dim joined = From row1 In t.AsEnumerable()
                  Join row2 In t2.AsEnumerable()
                  On row1.Field(Of Int32)("ID") Equals row2.Field(Of Int32)("ID") ' here i get the error: Value cannot be null. Parameter name: source
                  Select BothRows = New With {row1, row2}

    For Each x In joined
        Dim row1 As DataRow = x.row1
        Dim row2 As DataRow = x.row2
    Next
 end sub


   Public con As OleDbConnection
   Public dset As DataSet
   Public ad As OleDbDataAdapter
   Public cmd As OleDbCommand
   Public t As DataTable
Public t2 As DataTable

  Private Sub CreateDataTable(ByVal tb As DataTable, ByVal query As String,   ByVal table As String)
         Dim q As String = query
    con = New OleDbConnection
    con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Jonathan\Desktop\בסיס נתונים access\AddressBook.mdb"

    con.Open()
    dset = New DataSet
    cmd = New OleDbCommand(query, con)
    ad = New OleDbDataAdapter(cmd)
    ad.Fill(dset, table)
    con.Close()

    ' query dataset with linq
    tb = dset.Tables(table)
 end sub

我有 2 个来自不同 Access 数据库的数据表(所以我不能使用 SQL 连接语句),我需要通过相同的数字主键匹配来自 2 个表的记录中的 2 列。 我正在考虑 2 个选项:

  1. 多个 SQL SELECT 查询。
  2. 使用 Visual Basic 对 2 个数据表对象进行二分搜索。

什么方法更有效?更专业?这样做的正确方法是什么?

坦克

【问题讨论】:

    标签: sql vb.net linq search


    【解决方案1】:

    就效率和更重要的可读性和可维护性而言,最好的方法是使用Linq-To-DataSet

    Dim joined = From row1 In table1.AsEnumerable()
                 Join row2 In table2.AsEnumerable()
                 On row1.Field(Of Int32)("ID") Equals row2.Field(Of Int32)("ID")
                 Select BothRows = New With {row1, row2}
    
    For Each x In joined
        Dim row1 As DataRow = x.row1
        Dim row2 As DataRow = x.row2
    Next
    

    您需要添加Imports System.LinqEnumerable.Join 是高效的,因为它使用了一个集合。

    【讨论】:

    • OK 是时候进入 linq...谢谢@tim 我会使用那个方法。
    • 在测试建议后我遇到了一些错误......描述已在我原来的问题中进行了编辑。我会很感激你的帮助。
    • @Jonathan:你不能以这种方式初始化 CreateDataTable 中的数据表,因为参数不是 ByRef,实际上你只是在初始化一个局部变量。我建议从方法中返回此表,因此将其设为函数。当然你也可以在这个方法中分配字段 t 和 t1。
    • tnx!现在它的工作完美,最后一个问题,我如何从加入的变量中提取行数/列数?我没有找到任何属性
    • Joined 只是变量的名称,它包含具有两个属性 row1 和 row2 的匿名类型序列。因此,您可以使用像 For Each 这样的循环来枚举它们,如上所示。如果你想要一个集合,你可以使用 Joined.ToList 或 ToArray。如果您只想计数,请使用 Joined.Count()。
    猜你喜欢
    • 2017-09-25
    • 2011-01-24
    • 1970-01-01
    • 2014-07-10
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多