如何使用外键连接两个数据集以创建新数据集?

Posted

技术标签:

【中文标题】如何使用外键连接两个数据集以创建新数据集?【英文标题】:How can I join two datasets using a foreign key to create a new dataset? 【发布时间】:2014-02-26 13:14:04 【问题描述】:

我之前的 access 数据库中有一个外部链接表。代码运行良好。

但我认为使用代码来定义链接会更好。

所以现在我已经分离了每个表的 sql 来填充每个数据集。

如何使用外键连接两个数据集以创建新的组合数据集表?

下面我复制了我以前的 SQL 并尝试创建一个新的组合数据集。但我不知道从这里该怎么办......请你帮忙吗?

这是原始代码

        ' Querying data from database
        Using oConn As New OleDbConnection(strConnOrders)

            oConn.Open()

            ' First Select the supplier details best on the specified Preferred Supplier Foreign Key in tblOrderDetails.

            Dim sSQL As String

            sSQL = "SELECT O.fldBarcode, O.fldProductCode, O.fldProductName, O.fldPackSize, O.fldOrderQty, " & vbCrLf & _
                   "O.fldOrderFK, O.fldPrefSupplierFK, S.fldID,IIF(O.fldPrefSupplierFK IS NULL OR O.fldPrefSupplierFK = 0 " & vbCrLf & _
                   "OR O.fldPrefSupplierFK = 34 OR O.fldPrefSupplierFK = 1, 'Unspecified Supplier',S.fldSupplierName) AS fldSupplierName, S.fldSupplierAddress, " & vbCrLf & _
                   "S.fldSupplierPostCode, S.fldSupplierPhone, S.fldSupplierFax, S.fldSupplierEmail, S.fldSupplierWeb, S.fldContactName, " & vbCrLf & _
                   "IIF(S.fldAccountNo IS NULL, 'NA', S.fldAccountNo) AS fldAccountNo " & vbCrLf & _
                   "FROM tblOrderDetails O LEFT OUTER JOIN tblSuppliers S ON O.fldPrefSupplierFK = S.fldID " & vbCrLf & _
                   "WHERE (O.fldSelect = True);"

            Using da As New OleDbDataAdapter(sSQL, oConn)
                da.Fill(ds, "Report1Data")
            End Using

        End Using

这是新的测试代码

        ' THE DATASETS ARE FILLED SEPERATELY THIS TIME
        Dim dsSuppliersTable As New DataSet
        Dim dsOrdersTable As New DataSet
        Dim dsCombinedTable As New DataSet
        Dim dsReportData As New DataSet

        Dim strSqlSupplierFields As String = "SELECT S.fldID, fldSupplierName, S.fldSupplierAddress, S.fldSupplierPostCode, " & _
                                             "S.fldSupplierPhone, S.fldSupplierFax, S.fldSupplierEmail, S.fldSupplierWeb, " & _
                                             "S.fldContactName FROM tblSuppliers;"

        dsSuppliersTable = getDatasetTable(strConnSuppliers, strSqlSupplierFields, "tblSuppliers")  

        Dim strSqlOrderFields As String = "SELECT O.fldBarcode, O.fldProductCode, O.fldProductName, O.fldPackSize, O.fldOrderQty, " & _
                                          "IIF(O.fldPrefSupplierFK IS NULL OR O.fldPrefSupplierFK = 0, S.fldID, " & _
                                          "OR O.fldPrefSupplierFK = 1, 'Unspecified Supplier', S.fldSupplierName) AS fldSupplierName, " & _
                                          "O.fldOrderFK, O.fldPrefSupplierFK FROM tblOrderDetails WHERE (O.fldSelect = True);"

        dsOrdersTable = getDatasetTable(strConnOrders, strSqlOrderFields, "tblOrders")


        If dsOrdersTable.Tables(0).Rows.Count > 0 Then

            ' MERGE THE DATA FROM dsOrdersTable and dsSuppliersTable
            ' LINK THEM TOGETHER USING THE FOREIGN KEY

            dsCombinedTable.Tables("Report1Data") ' I'M NOT SURE WHAT TO DO HERE TO JOIN THE DATASETS TOGETHER

            ' ALSO THE IIF STATEMENT IN strSqlOrderFields IS WRONG NOW, BECAUSE IT USED TO LINK TO THE SUPPLIERS TABLE
            ' HOW CAN I SOLVE THIS?

            ' THEN SAVE THE NEW COMBINED DATASET INTO dsReportData,
            dsReportData.Tables.Add(dsCombinedTable.Tables("Report1Data"))

        End If

        ' THIS IS THE END OF NEW TEST CODE *****************************************************************************

【问题讨论】:

【参考方案1】:

在大多数情况下思考

最好用代码来定义链接。

...会错的。数据库经过优化,可以以多种方式完成此类事情。您只需要自己编写代码来创建第三个数据集,而且我敢打赌,您编写的代码不会像数据库那样高效。

使用联接。它们就是数据库的用途。

【讨论】:

我同意,但是,删除链接的原因是出于维护目的。如果数据库被移动到另一个位置,只要在应用程序配置中指定了新的连接字符串,它就不会破坏链接。但是,如果我继续使用 access 中的链接,支持技术人员将需要在 access 数据库和应用程序配置文件中定义新路径。更有可能的是,他们会忘记这样做,这会导致更多问题。因此我的推理。我知道这样性能会下降。但在这种情况下必须这样做。谢谢。

以上是关于如何使用外键连接两个数据集以创建新数据集?的主要内容,如果未能解决你的问题,请参考以下文章

LIBSVM 如何准备带有图像的训练数据集以进行徽标检测?

如何在不删除适配器的情况下更新数据集以反映数据源中添加的列?

如何按频率修剪数据集以符合论文的描述

公开大型 Web 服务数据集以供 Access 或 Excel 使用

如何从两个不同的 Laravel 查询构建器中获取我的两个结果集以同时显示在同一页面上?

如何裁剪可可数据集以进行预处理?