如何在VB.NET中内部联接两个已填充的数据表
我认为德尔戈勒姆的答案是正确的,因为它是我所说的具体问题的正确答案 不幸的是,我没有检测到datatable2中的记录不是唯一的这一事实,这显然与在两个表上执行“内部联接”以获得我想要的结果不匹配 如果是,设置数据关系将起作用如何在VB.NET中内部联接两个已填充的数据表,vb.net,datatable,merge,inner-join,Vb.net,Datatable,Merge,Inner Join,我认为德尔戈勒姆的答案是正确的,因为它是我所说的具体问题的正确答案 不幸的是,我没有检测到datatable2中的记录不是唯一的这一事实,这显然与在两个表上执行“内部联接”以获得我想要的结果不匹配 如果是,设置数据关系将起作用 我还不熟悉VB.NET,所以请耐心听我说 我有两个数据表,每个数据表由不同的数据库服务器填充 它们都有三列(为了便于测试,最终程序将有50+) 它们都有一个公共数据列(“OrderNum”),我想通过它进行内部连接 这里有一个问题,但“答案”对我不起作用,下面的LI
我还不熟悉VB.NET,所以请耐心听我说
- 我有两个数据表,每个数据表由不同的数据库服务器填充
- 它们都有三列(为了便于测试,最终程序将有50+)
- 它们都有一个公共数据列(“OrderNum”),我想通过它进行内部连接
DB1 = New DatabaseConnectionSQL1
DB1.OpenConn()
DB2 = New DB_DatabaseConnectionSQL2
DB2.OpenConn()
Dim dtA As DataTable = New DataTable("DataTable1")
Dim dtB As DataTable = New DataTable("DataTable2")
Dim dtCombined As DataTable = New DataTable("CombinedDataTable")
dtA.Columns.Add("Order", System.Type.GetType("System.String"))
dtA.Columns.Add("Account_Number", System.Type.GetType("System.String"))
dtA.Columns.Add("Account_Name", System.Type.GetType("System.String"))
'"Order" = "Head_Order_Number"
dtB.Columns.Add("Head_Order_Number", System.Type.GetType("System.String"))
dtB.Columns.Add("Line_Number", System.Type.GetType("System.Int32"))
dtB.Columns.Add("Model", System.Type.GetType("System.String"))
dtA = DB1.GetDataTable(sQuery1)
dtB = DB2.GetDataTable(sQuery2)
'This doesn't work as it just appends the table
'dtA.Merge(dtB, True)
'I tried creating a DataSet and setting a Relation, but that kept failing
'I've tried at least 10 different things here. I'm at my wit's end.
dgvDataGrid.DataSource = dtCombined
dgvDataGrid.Refresh()
DB1.CloseConn()
DB2.CloseConn()
我注意到其他地方的人建议使用Linq。虽然我对它不熟悉,但我尽了最大的努力,还是失败了
表A(dtA):
表B(dtB):
最后一个表我想将这两个表合并(dtCombined):
任何帮助都将不胜感激
我以前尝试过添加一个DataRelation,但一直出现错误,但我没有正确设置某些内容。现在我解决了这个问题,我得到了另一个错误: “System.ArgumentException:无法启用此约束,因为并非所有值都具有相应的父值。”
这个错误似乎有道理,因为DataTable1总共有1950行,而DataTable2有4000多行,但这不是DataRelation的要点吗?它有效地内部连接了两个表,因此最终结果应该是1950行。您要执行的查询如下所示:
Dim sql As String = "SELECT dta.*, dtB.* FROM dtA INNER JOIN dtB ON dtA.Order = dtB.Order"
请注意,Order=25000
的记录不是内部联接的一部分
[编辑]
根据你的评论,我发现你缺乏一些知识
因此-假设您已经准备好了db连接(conn):
我假设OleDb连接,但SQL连接实际上是一样的(用SQL替换OleDb)
[EDIT 2]你决定让我汗流浃背
最后,有一个非常具体的问题的解决方案:
如图所示:
DataRelation对象就是您所需要的
创建数据关系对象
' Create the DataRelation and
' relate the customers to their orders
DataRelation oDr_Customer2Order = new DataRelation("Customer2Order",
oDs.Tables["Customer"].Columns["CustomerID"],
oDs.Tables["Order"].Columns["CustomerID"]);
oDs.Relations.Add(oDr_Customer2Order);
通过创建DataRelation对象,然后将它们添加到数据集的Relations集合,三个DataTable对象的行集通过定义的字段相互关联。与大多数ADO.NET对象一样,DataRelation对象有几个不同的构造函数。我使用了接受关系名称、父表列和子表列的构造函数。如果有多个列定义了关系,那么我可以传入父表的列数组和子表的列数组。另一个选项是使用与我在图3中使用的前三个参数相同的参数,然后传入第四个参数,以表示是否应自动创建约束(传入布尔值)。但稍后会有更多关于约束的内容。
一旦数据集填充了三个行集,并且建立了链接DataTable对象的关系,通过如下设置DataSource属性,数据集可以轻松地显示在Web表单上的DataGrid中:
dataGrid1.DataSource = oDs;
DataGrid足够聪明,可以发现需要显示多个DataTable对象,并且它应该允许按DataRelation对象指定的顺序导航行集。要执行的查询如下所示:
Dim sql As String = "SELECT dta.*, dtB.* FROM dtA INNER JOIN dtB ON dtA.Order = dtB.Order"
请注意,Order=25000
的记录不是内部联接的一部分
[编辑]
根据你的评论,我发现你缺乏一些知识
因此-假设您已经准备好了db连接(conn):
我假设OleDb连接,但SQL连接实际上是一样的(用SQL替换OleDb)
[EDIT 2]你决定让我汗流浃背
最后,有一个非常具体的问题的解决方案:
如图所示:
DataRelation对象就是您所需要的
创建数据关系对象
' Create the DataRelation and
' relate the customers to their orders
DataRelation oDr_Customer2Order = new DataRelation("Customer2Order",
oDs.Tables["Customer"].Columns["CustomerID"],
oDs.Tables["Order"].Columns["CustomerID"]);
oDs.Relations.Add(oDr_Customer2Order);
通过创建DataRelation对象,然后将它们添加到数据集的Relations集合,三个DataTable对象的行集通过定义的字段相互关联。与大多数ADO.NET对象一样,DataRelation对象有几个不同的构造函数。我使用了接受关系名称、父表列和子表列的构造函数。如果有多个列定义了关系,那么我可以传入父表的列数组和子表的列数组。另一个选项是使用与我在图3中使用的前三个参数相同的参数,然后传入第四个参数,以表示是否应自动创建约束(传入布尔值)。但稍后会有更多关于约束的内容。
一旦数据集填充了三个行集,并且建立了链接DataTable对象的关系,通过如下设置DataSource属性,数据集可以轻松地显示在Web表单上的DataGrid中:
dataGrid1.DataSource = oDs;
DataGrid足够聪明,可以发现需要显示多个DataTable对象,并且它应该允许按DataRelation对象指定的顺序导航行集。order=Head\u order\u Number吗?是的,order=Head\u order\u Number在ADO.Net中非常困难-访问简单。。。正如Jim所建议的,获取数据的本地副本可能是一条可行之路。创建两个查询,每个查询只返回相关数据。或者获取一个集合并使用它将查询构建到
' Create the DataRelation and
' relate the customers to their orders
DataRelation oDr_Customer2Order = new DataRelation("Customer2Order",
oDs.Tables["Customer"].Columns["CustomerID"],
oDs.Tables["Order"].Columns["CustomerID"]);
oDs.Relations.Add(oDr_Customer2Order);
dataGrid1.DataSource = oDs;