2011-10-12 56 views
0

我已經發現如何通過another question將CSV導入我的Access數據庫。但在answer中沒有關於如何在導入時定位特定列的信息。我怎樣才能確保CSV中的正確列被放到我的數據庫的正確列中?在導入時指定目標列(CSV到Access)

我需要能夠編輯/添加到列值,因爲他們得到導入使用傳統的ASP。示例:

  • CSV中的第4列是一個用戶標識,我需要能夠在它進入電子郵件列的數據庫時將「@ domain.com」添加到結尾。
  • 第6欄是一個分類:如果它的值是「老師」,那麼當它被導入時,我需要將其更改爲「教室」。

我正在使用一些舊代碼&我沒有創建的DB。相信我,如果可以的話,我會使用其他的東西,,所以請不要使用MS Access。

我想這整個事情歸結爲:

  • 如果previous question's answer真的讓我對待CSV同一個數據庫表,那我怎麼才能選擇列作爲一個真正的數據庫表?


//更新:

我已經把一切都弄好我怎麼相信也是應該的,但是我收到一個錯誤:

ADODB.Recordset error '800a0bb9' 

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another. 

/datazone_bkup/Rollover/importTeachers.asp, line 12 

線我的完整代碼如下:

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_ 
      Server.MapPath("\path\to\file") & ";Extended Properties='text;HDR=no;FMT=Delimited';" 

Set connCSV = Server.CreateObject("ADODB.Connection") 
connCSV.Open strConn 

Set CSV = Server.CreateObject("ADODB.recordset") 
    CSV.open "SELECT * FROM teachers.csv", conn 

    do until CSV.eof 
     UserName = CSV.Fields(4) 
     LastName = CSV.Fields(1) 
     FirstName = CSV.Fields(2) 
     MiddleName = CSV.Fields(3) 
     School = CSV.Fields(5) 
     if CSV.Fields(6) = "Teacher" then 
      SecLevel = "Classroom" 
     end if 
     Active = "Yes" 
     TeacherNumber = rsCSV.Fields(0) 
     rsCSV.movenext 

     sql = "INSERT INTO tblTeacher (UserName, LastName, FirstName, MiddleName, School, SecLevel, Active, TeacherNumber) " &_ 
       "VALUES (" &_ 
        "'" & UserName & "','" & LastName & "','" & FirstName & "','" & MiddleName & "'," &_ 
        "'" & School & "','" & SecLevel & "','" & Active & "','" & TeacherNumber & "'" &_ 
       ")" 

     on error resume next 
     conn.execute(sql) 
    loop 

@HansUp,當我嘗試使用!rsDB!UserName,我接到Syntax Error。所以我回到設置CSV列值的變量。

再次感謝您的幫助。

+0

這是嚇人的sql注入黑客攻擊 –

+0

@JoelCoehoorn,謝謝你的關注;但是,這是在內部網上,並且受密碼保護。在這個網站上SQL注入的可能性很小。 – joshmax

回答

1

正如上一個問題所鏈接的那樣,假設您已經打開了一個帶有CSV內容的ADO記錄集。您可以打開訪問目標表的第二個ADO記錄集。

如果CSV文件包含列名稱,則可以遍歷其recorset行並將其值插入目標記錄集。如果CSV記錄是rsCSV和recorset爲目標表是RSDB ...

Do While Not rsCSV.EOF 
    rsDB.AddNew 
    rsDB!userid = rsCSV!userid & "@domain.com" 
    If rsCSV!classification = "Teacher" Then 
     rsDB!classification = "Classroom" 
    Else 
     rsDB!classification = rsCSV!classification 
    End If 
    rsDB.Update 
    rsCSV.MoveNext 
Loop 

如果CSV不包括列名,你仍然可以做,但需要使用在該領域的順序位置字段集合。這些位置編號是從零開始的,因此第3列爲3,等等。

Do While Not rsCSV.EOF 
    rsDB.AddNew 
    rsDB!userid = rsCSV.Fields(3) & "@domain.com" 
    If rsCSV.Fields(5) = "Teacher" Then 
     rsDB!classification = "Classroom" 
    Else 
     rsDB!classification = rsCSV.Fields(5) 
    End If 
    rsDB.Update 
    rsCSV.MoveNext 
Loop 
+0

謝謝**非常**。一個非常清晰和簡潔的答案。此外,感謝您提供「無列名」代碼,因爲我正在使用的csv沒有它們。我會讓你知道它是如何工作的。 – joshmax

+0

遇到一些問題,請參閱更新的問題。 – joshmax