【问题标题】:multiple connection strings in single query单个查询中的多个连接字符串
【发布时间】:2017-01-30 00:08:50
【问题描述】:

在 VB 中,如何将来自不同技术的两条语句连接到一个记录集中?假设我有 2 个陈述:

Select name from server1.dbo.table1 where attribute = "something"
select name from server2.dbo.table2 where attribute = "something else"

我可以运行这些语句中的每一个。假设 table1 是一个平面文件,而 table2 来自 SQL Server(或其他任何东西,没关系,希望如此)。我想要发生的是将这些加入到 table3 中,它将在第三种技术中创建(可能是 SAP,但对于这个问题我们忽略它)。我想要一个有点像这样的声明:

select table1.name into server3.dbo.table3 from table1 join table2 on table1.name=table2.name

我可以在 VB 中的单个查询中使用三个单独的连接字符串吗?

对于这个项目,我可以使用 vb.net、vbscript,甚至 vba/vb6,等等。如果我不得不离开 VB,这将使与第三技术的连接变得更加困难,但并非不可能。另一方面,我与数据访问接口(ado/dao/rdo/ODBC/OLEDB/etc.)无关。

【问题讨论】:

  • 您需要将技术本身连接起来,还是可以查询每个数据源并将结果组合到内存中?如果您有两个或多个相同类/类型的集合,您可以随时将它们合并到一个集合中。
  • 那么,您想将 2 个表合并为第 3 个表(表 1 + 表 2 = 表 3),但表 3 位于不同的 DBMS 中?
  • @David 谢谢。如果它有助于您理解:table1 可能有大约 40K 条“记录”,可能是制表符或逗号分隔。 table2 可能有大约 10 万条记录,采用某种结构化的表格格式。我不需要出于任何原因连接这些技术,只是试图将信息从表 1 和 2 的大约 35K 记录中传输到 table3 中,以便使用不同的进程在 table3 的技术中获取它并做它的事情。所以,回答你的问题:后者。没有。
  • 为了完整起见,我知道我可以使用循环来迭代数万次......但我认为说我不想这样做是不合理的。
  • 以下两个似乎都是很好的答案;我与另一个客户分道扬镳。在我尝试完这两个想法后,我会接受一个。

标签: sql vb.net connection-string


【解决方案1】:

我相信你不能直接这样做。通常,我在这些情况下所做的就是在其中一个连接上创建一个临时表,并从其上的另一个连接导入所有数据。然后我执行一个连接并将数据移动到第三个连接。

Imports System.Data.SqlClient

Module Module1

Sub Main()
    Dim connectionString1 = "YOUR FIRST CONNECTIONSTRING HERE"
    Dim connectionString2 = "YOUR SECOND CONNECTIONSTRING HERE"

    Using connection1 = New SqlConnection(connectionString1)
        connection1.Open()

        Using command = connection1.CreateCommand()
            command.CommandText = "CREATE TABLE #T (Name VARCHAR(64))"
            command.ExecuteNonQuery()
        End Using

        Using connection2 = New SqlConnection(connectionString2)
            connection2.Open()

            Using command = connection2.CreateCommand()
                command.CommandText = "SELECT Name FROM Table2"
                Using reader = command.ExecuteReader()

                    Using bulkCopy = New SqlBulkCopy(connection1)
                        bulkCopy.DestinationTableName = "#T"
                        bulkCopy.BatchSize = 10000
                        bulkCopy.ColumnMappings.Add(0, "Name")
                        bulkCopy.WriteToServer(reader)
                    End Using
                End Using
            End Using
        End Using

        Using command = connection1.CreateCommand()
            command.CommandText = "SELECT Table1.Name FROM Table1 INNER JOIN #T ON Table1.Name = #T.Name"

            Using reader = command.ExecuteReader()
                ' Do what you want with the joined data here, 
                ' if you like you can BulkCopy it on another connection
            End Using
        End Using
    End Using
End Sub

End Module

【讨论】:

  • 使用我的特殊技术,临时表比其他建议更容易。谢谢。
【解决方案2】:

我可以在 VB 中的单个查询中使用三个单独的连接字符串吗?

不,你不能。

因为当您运行查询时(几乎在所有语言中),您实际上将字符串传递给驱动程序,驱动程序本身将查询实际数据库。这就是 ADO、OLEDB 等的目的。

因此,在单个查询中,这是不可能的。

但是,您可以填充两个不同的数据集,一个用于您的每种技术。

完成后,您可以创建第三个数据集,它将混合前两个数据集。您“手动”构建第三个数据集。

如果您只需要从数据库中读取 (SELECT) 就可以了。

如果你想在那里写,你必须将第三个数据集所做的任何更改报告给前两个,然后将这些更改提交到数据库中。

【讨论】:

    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多