使用VB.NET加入来自不同数据源的两个查询

时间:2014-08-01 19:54:55

标签: sql sql-server vb.net oracle

我有两个问题。一个是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")

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我非常喜欢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来自己完全测试,但我希望你能够朝这个方向发展。

相关问题