SQL选择与二进制搜索
为了便于将来的问题,我添加了文档 将数据提取到datagridview,我知道代码远不是非常清晰,它只是为了理解这个主题的属性SQL选择与二进制搜索,sql,vb.net,linq,search,Sql,Vb.net,Linq,Search,为了便于将来的问题,我添加了文档 将数据提取到datagridview,我知道代码远不是非常清晰,它只是为了理解这个主题的属性 CreateDataTable(Me.t, "SELECT * FROM tblContacts", "tblContacts") CreateDataTable(Me.t2, "SELECT * FROM ContactsData", "ContactsData") Dim joined = From row1 In t.AsEnumerab
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到数据集的测试,但我得到了一个错误,我不知道为什么。。
错误描述为“值不能为空”。参数名称:源'
以防万一,我已经测试了一个常规的SQL内部连接查询,它的工作状态良好
我在access中创建了两个表这是表
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
我有两个来自不同Access数据库的数据表,因此我不能使用SQL连接语句,我需要通过相同的数字主键匹配来自这两个表的记录中的两列。
我正在考虑两种选择:
多个SQL选择查询。
使用visual basic对2个datatable对象进行二进制搜索。
什么方法更有效?更专业?正确的方法是什么
tanx就效率以及更重要的可读性和可维护性而言,最好的方法是使用:
您需要添加Imports System.Linq。因为它使用了一个集合,所以效率很高。好,现在是进入linq的时候了……谢谢@tim,我将使用该方法。在测试该建议后,我正在努力解决一些错误。。。描述在我的原始问题中被编辑。我将非常感谢您的帮助。@Jonathan:您不能以这种方式在CreateDataTable中初始化datatable,因为参数化程序不是ByRef,实际上您只是在初始化一个局部变量。我建议从方法中返回此表,因此将其设置为函数。当然,您也可以在这个方法中分配字段t和t1。tnx!最后一个问题是,如何从连接的变量中提取行数/列数?我没有找到任何属性,Joined只是包含匿名类型序列的变量的名称,该序列有两个属性row1和row2。因此,您可以使用类似于For Each的循环来枚举它们,如我上面所示。如果您想要收藏,可以使用Joined.ToList或ToArray。如果只需要计数,请使用Joined.count。
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