2012-07-11 46 views
3

通常,我只需循環使用Recordset.AddNew,但在處理大型記錄集時這會很痛苦 - 是否有更好的方法來執行此操作?我希望有一種方法可以簡單地寫一個插入語句從Oracle到Access,也許通過使用兩個ADO連接,但我能找到的唯一例子是在VB.net中(使用OleDbCommand),這可悲的不是選項。這僅僅是VBScript的限制嗎?通過VBScript將數據從Oracle移動到MS Access的最快方法

謝謝!

+2

OOF - 你shuold能夠從作爲訪問遠程數據庫直接連接到Oracle - - 所有你走錯路了:)的第一個然後就發出SQL INSERT語句 - 就像INSERT INTO mytable的作爲從yourtable中選擇。 – Randy 2012-07-11 20:35:36

+0

@Randy說什麼。重要時刻。 – Fionnuala 2012-07-11 20:36:36

+0

謝謝!我曾考慮過這樣做,但是出於幾個原因避免了它(現在我需要強調問題的愚蠢) - 實質上,他們希望我爲大約230個位置提供低級數據並加載他們到個人訪問數據庫= /查詢本身大多是相同的 - 只有位置會改變,所以我認爲可能有一個更簡單的方法。是的,我意識到他們想要這樣做的事實是愚蠢而荒謬的。你認爲從每個Access實例連接到Oracle還是更有意義嗎? – Karter705 2012-07-11 20:49:40

回答

1

您的問題標籤包含access-vba,所以我會建議DoCmd.TransferDatabase Method

本示例在頁面底部附近創建一個指向SQL Server表的ODBC鏈接。它假定名爲DataSource1的DSN(數據源名稱)。 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。

在閱讀您的意見後,我認爲您會更好地採用不同的方法。

使用ODBC鏈接創建一個數據庫到Oracle表。

然後將該表數據的子集導出到您的單個數據庫文件。

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

然後調整每個目標db文件和數據選擇標準的SQL。從一個簡單的VBA程序開始應該很容易。

+0

對不起 - 我應該在OP中更加清楚 - 我可以使用VBA,我只是覺得VBScript可能更容易,因爲我需要處理大量的訪問數據庫。也許我可以使用VBScript中的Access應用程序對象的TransferDatabase方法? MSDN也有一個說明,我可以使用ADO Recordset.ActiveConnection?我只是不確定最好的方法是什麼。 – Karter705 2012-07-11 20:59:25

+0

我認爲最好的方法是根據Remou的評論。我將其概述爲對我的答案的更新。 – HansUp 2012-07-11 21:09:03

+0

這很有道理!謝謝你的幫助! – Karter705 2012-07-11 21:10:15

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 
相關問題