3

通常,我只会循环使用 Recordset.AddNew,但是在处理大型记录集时这会非常缓慢——有没有更好的方法来做到这一点?我希望有一种方法可以简单地编写从 Oracle 到 Access 的插入语句,可能是通过使用两个 ADO 连接,但我能找到的唯一示例是在 VB.net(使用 OleDbCommand)中,遗憾的是这不是选项。这仅仅是 VBScript 的限制吗?

谢谢!

4

2 回答 2

1

您的问题标签包括 access-vba,因此我建议使用DoCmd.TransferDatabase Method

此示例位于页面底部附近,用于创建指向 SQL Server 表的 ODBC 链接。它假定一个名为 的 DSN(数据源名称)DataSource1。Access 中的链接名称为Authors,服务器源表为dboAuthors

DoCmd.TransferDatabase acLink, "ODBC Database", _
    "ODBC;DSN=DataSource1;UID=User2;PWD=www;LANGUAGE=us_english;" _
    & "DATABASE=pubs", acTable, "Authors", "dboAuthors"

您可以使用适当的 DSN 为 Oracle 调整它。如果您想导入而不是链接,请替换acImportacLink.

实际上,您甚至可能不需要为此编写代码。使用有效的 DSN,您可以通过 Access 用户界面导入(或链接)。

您的标题提到了 VBScript。告诉我们您是否真的必须使用 VBScript 而不是 VBA。

阅读您的评论后,我认为您最好采用不同的方法。

创建一个带有指向 Oracle 表的 ODBC 链接的数据库。

然后将该表数据的子集导出到您的各个数据库文件。

SELECT master_link.* INTO local_table IN 'c:\somefolder\db1.mdb'
FROM master_link
WHERE location = 'location1';

然后调整每个目标 db 文件的 SQL 和数据选择标准。从一个简单的 VBA 程序中驱动它应该很容易。

于 2012-07-11T20:50:50.843 回答
0

以下是使用 SQL Server 而不是 Oracle 的 VBScript 的一些注意事项,但是,应该可以使用非常相似的东西。

Const CreatePath = "Z:\docs\"
Const Provider = "Microsoft.ACE.OLEDB.12.0;"
''The easiest way to get this line is from the connect property of 
''a linked table
Const ServerInLine = "[ODBC;DRIVER=SQL Server;SERVER=server;Trusted_Connection=Yes;DATABASE=db]"
''Change this to the Oracle connection
Const ServerConnect = "Provider=sqloledb;Data Source=server;Initial Catalog=db;Integrated Security=SSPI;"

Dim cnSS ''As ADODB.Connection
Dim cnMSA ''As ADODB.Connection
Dim cat ''As New ADOX.Catalog

Set cat = CreateObject("ADOX.Catalog")

Set cnSS = CreateObject("ADODB.Connection")
Set cnMSA = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cnSS.Open ServerConnect

''Only the locations that exist. Assuming a location table
''with a description, Location
sSQL = "SELECT DISTINCT a.LocationID, b.Location FROM ATable a "
sSQL = sSQL & "INNER JOIN Location b ON a.LocationID = b.ID"

rs.Open sSQL, cnSS

Do While Not rs.EOF

    DBName = CreatePath & Trim(rs.Fields("Location")) & ".accdb"
    scn = "Provider=" & Provider & ";Data Source=" & DBName

    cat.Create scn

    cnMSA.Open scn

    sSQL = "SELECT * INTO " & Replace(Trim(rs.Fields("Location")), " ", "")
    sSQL = sSQL & " FROM " & ServerInLine & ".ATable"
    sSQL = sSQL & " WHERE LocationID=" & rs.Fields("LocationID")

    cnMSA.Execute sSQL, recs
    sMsg = sMsg & vbCrLf & DBName & " created " & recs

    rs.MoveNext
    cnMSA.Close
Loop

MsgBox sMsg
于 2012-07-12T17:01:30.683 回答