【问题标题】:Join two queries from different data sources using VB.NET使用 VB.NET 连接来自不同数据源的两个查询
【发布时间】:2014-09-25 02:24:11
【问题描述】:

我有两个问题。一种是 Oracle 查询,一种是 SQL Server 查询。

Oracle 列:ID、主题、课程

SQL Server 列:ID、推荐主题、推荐课程

我想加入关于 ID 的两个查询。我需要找出哪些 ID 的主题不等于推荐的主题或课程不等于推荐的课程。然后,在 GridView 中显示结果。

这是我迄今为止尝试做的事情。我删除了我的 SQL 命令和连接字符串。

Dim sConnectionString As String = ConfigurationManager.ConnectionStrings("sqlserver").ConnectionString
Dim sCN As New SqlConnection(sConnectionString)
Dim sCommandWrapper As SqlCommand = New SqlCommand("SQL", sCN)
Dim sDataAdapter As SqlDataAdapter = New SqlDataAdapter
sDataAdapter.SelectCommand = sCommandWrapper

Dim pConnectionString As String = ConfigurationManager.ConnectionStrings("oracle").ConnectionString
Dim pCN As New OleDbConnection(pConnectionString)
Dim pCommandWrapper As OleDbCommand = New OleDbCommand("SQL", pCN)
Dim pDataAdapter As OleDbDataAdapter = New OleDbDataAdapter
pDataAdapter.SelectCommand = pCommandWrapper

Dim stopDS As DataSet = New DataSet()
sDataAdapter.Fill(stopDS, "Recommendations")
pDataAdapter.Fill(stopDS, "Registrations")

【问题讨论】:

  • 在你的 sql server 上创建一个链接服务器,并将它们加入到你的查询中。我知道甲骨文有类似的东西,但我不知道它是什么。在我看来,尝试在 .net 中执行此操作是错误的位置。
  • vb 中没有像 SQL 中那样的 JOIN。您将不得不遍历每条记录以在另一个表中寻找匹配项。这可以使用诸如哈希表之类的东西来加速,但它仍然是相同的概念。

标签: sql sql-server vb.net oracle


【解决方案1】:

由于DataSet 中有两个结果,因此可以使用DataSet.Relations 属性定义两个表之间的关系:

stopDS.Relations.Add(
    "ID2ID",
    stopDS.Tables("Recommendations").Columns("ID"),
    stopDS.Tables("Registrations").Columns("ID")
)

然后您可以从关系的任一端获取匹配的行(如果我把关系弄错了,请道歉!):

Dim rows() As DataRow = stopDS.Tables("Recommendations").Rows(0).GetChildRows("ID2ID")
Dim row As DataRow = stopDS.Tables("Registrations").Rows(0).GetParentRow("ID2ID")
' Can also use .GetParentRows(...) for an array.

这是一个完整的控制台应用示例:

Module Module1

    Sub Main()

        Dim t1 = New DataTable()
        t1.TableName = "Names"
        t1.Columns.Add("ID", GetType(Integer))
        t1.Columns.Add("Name", GetType(String))

        Dim t2 = New DataTable()
        t2.TableName = "Addresses"
        t2.Columns.Add("ID", GetType(Integer))
        t2.Columns.Add("Address", GetType(String))

        Dim r As DataRow = Nothing

        r = t1.NewRow()
        r("ID") = 1
        r("Name") = "Bob"
        t1.Rows.Add(r)
        r = t1.NewRow()
        r("ID") = 2
        r("Name") = "Joe"
        t1.Rows.Add(r)
        r = t1.NewRow()
        r("ID") = 3
        r("Name") = "Sue"
        t1.Rows.Add(r)

        r = t2.NewRow()
        r("ID") = 1
        r("Address") = "1 Main St"
        t2.Rows.Add(r)
        r = t2.NewRow()
        r("ID") = 3
        r("Address") = "2 Any St"
        t2.Rows.Add(r)

        Dim ds = New DataSet()
        ds.Tables.Add(t1)
        ds.Tables.Add(t2)

        ' Define relationship between the ID columns
        ds.Relations.Add(
            "NameToAddress",
            ds.Tables("Names").Columns("ID"),
            ds.Tables("Addresses").Columns("ID"))

        For Each nameRow In t1.AsEnumerable()
            Console.WriteLine("Name: {0}", nameRow.Field(Of String)("Name"))
            For Each addrRow In nameRow.GetChildRows("NameToAddress")
                Console.WriteLine("--Addr: {0}", addrRow.Field(Of String)("Address"))
            Next
        Next

        Console.WriteLine("==========")

        For Each addrRow In t2.AsEnumerable()
            Console.WriteLine("Addr: {0}", addrRow.Field(Of String)("Address"))
            Dim pr = addrRow.GetParentRow("NameToAddress")
            If pr IsNot Nothing Then
                Console.WriteLine("++Name: {0}", pr.Field(Of String)("Name"))
            End If
            For Each nameRow In addrRow.GetParentRows("NameToAddress")
                Console.WriteLine("--Name: {0}", nameRow.Field(Of String)("Name"))
            Next
        Next

        Console.ReadLine()

    End Sub

End Module

结果是:

Name: Bob
--Addr: 1 Main St
Name: Joe
Name: Sue
--Addr: 2 Any St
==========
Addr: 1 Main St
++Name: Bob
--Name: Bob
Addr: 2 Any St
++Name: Sue
--Name: Sue

【讨论】:

  • 我需要两条 DataRow 行还是只需要一条?获得匹配的行后,如何在 gridview 中显示结果?
  • @Tmcc 您只需要DataRow 行,该行将关系导航到您感兴趣的方向 - 即从父母到孩子或从孩子到父母。在GridView 中显示它是一个更有趣的问题——我认为在DataSet 中显示来自多个DataTables 的相关数据没有任何本机支持。在这种情况下,链接服务器解决方案可能会更好,因此您只有一个DataTable,或者您可以使用 LINQ 将两个DataTables 加入内存中。
【解决方案2】:

我真的很喜欢 Mike 的方法,但让我建议另一种方法,您可以选择更适合您的方法。

您可以为您的 Oracle 数据库设置链接服务器。它在this answer 中有描述。或者你可以关注this article

然后简单的将两张表连接起来,得到结果:

SELECT * FROM SqlTable s
INNER JOIN OracleServer.OracleDB..OracleTable o ON o.ID = s.ID 
      AND (s.Course != o.[Recommended Course] OR s.Subject != o.[Recommended Subject])

很遗憾,我自己没有安装 oracle 来完全测试这个,但我希望你能找到方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多