Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VB.NET中内部联接两个已填充的数据表_Vb.net_Datatable_Merge_Inner Join - Fatal编程技术网

如何在VB.NET中内部联接两个已填充的数据表

如何在VB.NET中内部联接两个已填充的数据表,vb.net,datatable,merge,inner-join,Vb.net,Datatable,Merge,Inner Join,我认为德尔戈勒姆的答案是正确的,因为它是我所说的具体问题的正确答案 不幸的是,我没有检测到datatable2中的记录不是唯一的这一事实,这显然与在两个表上执行“内部联接”以获得我想要的结果不匹配 如果是,设置数据关系将起作用 我还不熟悉VB.NET,所以请耐心听我说 我有两个数据表,每个数据表由不同的数据库服务器填充 它们都有三列(为了便于测试,最终程序将有50+) 它们都有一个公共数据列(“OrderNum”),我想通过它进行内部连接 这里有一个问题,但“答案”对我不起作用,下面的LI

我认为德尔戈勒姆的答案是正确的,因为它是我所说的具体问题的正确答案

不幸的是,我没有检测到datatable2中的记录不是唯一的这一事实,这显然与在两个表上执行“内部联接”以获得我想要的结果不匹配

如果是,设置数据关系将起作用


我还不熟悉VB.NET,所以请耐心听我说

  • 我有两个数据表,每个数据表由不同的数据库服务器填充
  • 它们都有三列(为了便于测试,最终程序将有50+)
  • 它们都有一个公共数据列(“OrderNum”),我想通过它进行内部连接
这里有一个问题,但“答案”对我不起作用,下面的LINQ选项也不起作用:

这是我的示例代码:

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;