通常,我只会循环使用 Recordset.AddNew,但是在处理大型记录集时这会非常缓慢——有没有更好的方法来做到这一点?我希望有一种方法可以简单地编写从 Oracle 到 Access 的插入语句,可能是通过使用两个 ADO 连接,但我能找到的唯一示例是在 VB.net(使用 OleDbCommand)中,遗憾的是这不是选项。这仅仅是 VBScript 的限制吗?
谢谢!
您的问题标签包括 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 调整它。如果您想导入而不是链接,请替换acImport
为acLink
.
实际上,您甚至可能不需要为此编写代码。使用有效的 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 程序中驱动它应该很容易。
以下是使用 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