Ms access 通过VBScript将数据从Oracle移动到MS Access的最快方法

Ms access 通过VBScript将数据从Oracle移动到MS Access的最快方法,ms-access,vbscript,oracle11g,vba,Ms Access,Vbscript,Oracle11g,Vba,通常,我只会循环使用Recordset.AddNew,但在处理大型记录集时,这会非常缓慢-有更好的方法吗?我希望有一种方法可以简单地编写一个insert语句,从Oracle转到Access,也许可以使用两个ADO连接,但我能找到的唯一示例是在VB.net中使用OleDbCommand,遗憾的是,这不是一个选项。这仅仅是VBScript的一个限制吗 谢谢 您的问题标签包括access vba,因此我建议您使用 此示例位于页面底部附近,用于创建指向SQL Server表的ODBC链接。它采用名为Da

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


谢谢

您的问题标签包括access vba,因此我建议您使用

此示例位于页面底部附近,用于创建指向SQL Server表的ODBC链接。它采用名为DataSource1的DSN数据源名称。Access中的链接名为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

oof-首先,您走错了方向:-您应该能够作为远程数据库直接从access连接到Oracle-然后只需发出SQL insert语句-如insert INTO mytable as select from yourtable。谢谢!我曾经考虑过这样做,但由于一些原因避免了这样做,现在我需要强调问题的愚蠢性-本质上,他们希望我提取约230个位置的低级数据,并将它们加载到单个access数据库=/查询本身基本相同-只有位置会改变,所以我想可能有更简单的方法。是的,我意识到他们想这样做的事实是愚蠢和可笑的。您认为从每个Access实例连接到Oracle更有意义吗?在MS Access中针对连接选择“进入”如何?抱歉-我应该在操作中更清楚-我可以使用VBA,我只是觉得VBScript可能更容易,因为我需要处理大量Access数据库。也许我可以从VBScript中的Access应用程序对象使用TransferDatabase方法?MSDN还有一条说明,我可以使用ADO Recordset.ActiveConnection?我只是不确定最好的方法是什么。我认为最好的方法是per Remou的评论。我把它概括为对我答案的更新。这很有道理!谢谢你的帮助!
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