2014-06-19 227 views
3

系統背景:我在Access 2010中使用用戶界面和存儲數據庫的Microsoft SQL Server 2008後端。將分隔文件(.cvs)中的行導入到MS-Access表中

問題背景:我實驗室中的一臺機器以.csv文件的形式輸出結果。這些文件被放置在服務器上的一個文件夾中。目前,結果被手動輸入到數據庫中。我們的目標是在訪問程序(VBA)中逐行讀入文件中的數據,並將文件的每一行插入數據庫中的特定表中。我被指示給我們ADO對象來完成這個任務。

進度:我的問題在於嘗試讀取分隔文件的每一行。我被給了一個參考網站http://msdn.microsoft.com/en-us/library/ms974559.aspx,但是當我嘗試在字幕下實施示例時,我如何使用ADO查詢文本文件?和我得到了不少錯誤堅持方法沒有被發現具體連接。打開。我想獲得每行的值並將它們存儲到臨時變量中以傳遞給存儲過程。存儲過程已經創建並且已經創建了插入新記錄的過程。

旁註代碼:該代碼是一個較低級別的函數,這意味着它不會同時讀取該文件夾中的所有.csv文件。該函數由一個更高級別的函數給出一個文件名,並從該文件名中讀取指定文件中的每一行,並將其存儲在表「tblICPMS」中。這是什麼樣的.cvs文件時看起來在Excel enter image description here

這裏開了像樣品是我的代碼:

Public Function ImportICPMS(ThisFileName As String, ThisQueueID As Long, BatchID 
As Long, InstrumentName As String, TechId As Long) 
On Error GoTo HandleError 

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H0001 

Dim obj_fso As Object 
Dim objconnection As connection 
Dim objRecordset As Recordset 
Dim strpathtotextfile As String 

'test if file exists (newpath is a public path to folder)' 
Set obj_fso = CreateObject("Scripting.FileSystemObject") 
If obj_fso.FileExists(NewPath & "\" & ThisFileName) Then 
Else 
    Err.Raise vbObjectError + 1000, "MyProjectName.MyObjectName", "file " & ThisFileName & " for " & InstrumentName & " not found" 'if false error is raised 
End If 

Set objconnection = CreateObject("ADODB.connection") 'create ADO objects' 
Set objRecordset = CreateObject("ADODB.recordset") 

strpathtotextfile = NewPath & "\" 'path to folder where file resides' 

objconnection.Open "Provider=SQLOLEDB.1;Data Source=strpathtotextfile;Extended Properties=;HDR = YES;FMT = Delimited" 

objrecordset.Open "SELECT * FROM " & ThisFileName,objconnection, adOpenStatic, adLockOptimistic, adCmdText 

Do Until objRecordset.EOF 

'I do not know what Wscript.Echo means but I want to save the acquired values into 
temp variables to pass them to a stored procedure that inserts them into the table' 

Wscript.Echo objRecordset.Fields.Item("Sample Name") 
Wscript.Echo objRecordset.Fields.Item("Date and Time Acquired") 
Wscript.Echo objRecordset.Fields.Item("Element Full Name") 
Wscript.Echo objRecordset.Fields.Item("Concentration") 
Wscript.Echo objRecordset.Fields.Item("Units") 

'code to insert rows into table would probably go here' 
'code to clear out local objects would go here' 

objRecordset.MoveNext 

Loop 
objRecordset.Close 
objconnection.Close 

我不包括代碼的其餘部分也不是存儲過程,但我可以的,如果你有人想看到他們。我只想將我插入的代碼集中在我正在處理的部分上。

+0

另外CONST爲adCmdText =&H0001不斷自動改變到CONST爲adCmdText = H1 – VictoriaJay

回答

1

您使用的方法不存在的問題可能是它沒有正確使用該提供程序打開CSV。 據我所知,SQLOLEDB.1沒有這個文本閱讀器功能。

試試這個,改:

objconnection.Open "Provider=SQLOLEDB.1;Data Source=strpathtotextfile;Extended Properties=;HDR = YES;FMT = Delimited" 

對此,

objconnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=strpathtotextfile;Extended Properties=""Text;HDR=YES;FMT=Delimited""" 

更新:發現與聲明的一個問題:

Dim objconnection As connection 
Dim objRecordset As Recordset 

將正常運行,

Dim objconnection As Object 
Dim objRecordset As Object 
+0

感謝您的建議,我切換它和仍然收到一個編譯錯誤「方法或數據成員找不到」與連接。打開突出顯示 – VictoriaJay

+0

我更正了我的答案,因爲我注意到擴展屬性沒有文本並且注意到雙引號 –

+0

objconnection仍然存在問題。打開,你知道如果object.open是一種可以在VBA中使用的方法? – VictoriaJay

0

此過程用Delphi XE2 寫入它讀取CVS字段,並把它的成ADO表

procedure addRowsFromCVS(cvsFileName : string; tblDocumentiRighe: TADOTable); 

var 
    cvsFileToImport : TStringlist; 
    rowCount   : integer; 
    fieldCount  : integer; 
    fields   : TStrings; 
    fieldValues  : TStrings; 

    start    : integer; 
    currentFieldName : string; 
    currentFieldValue : string; 

begin 
    // create memory string list 
    cvsFileToImport := TStringlist.create; 
    fields   := TStringlist.create; 
    fieldValues  := TStringlist.create; 

    // load rows from file 
    cvsFileToImport.loadFromFile(cvsFileName); 

    // split fields row 
    split(';', cvsFileToImport[0], fields); 

    // first field 
    start := 0; 

    // for all the rows 
    for rowCount := 1 to cvsFileToImport.count - 1 do begin 
    // start insert 
    tblDocumentiRighe.insert; 

    // get field values 
    split(';', cvsFileToImport[rowCount], fieldValues); 

    // ... 
    for fieldCount := start to fieldValues.count - 1 do begin 
     currentFieldName := fields  [fieldCount]; 
     currentFieldValue := fieldValues[fieldCount]; 

     if currentFieldValue <> '' then begin 
     tblDocumentiRighe.fieldByName(currentFieldName).asString := currentFieldValue; 
     end; 
    end; 

    // post record 
    tblDocumentiRighe.post; 
    end; 

    // free 
    fieldValues .free; 
    fields   .free; 
    cvsFileToImport.free; 
end; 
相關問題