2013-10-04 74 views
0

將多個記錄插入Access數據庫與VB.net的最有效方法是什麼?將多個記錄插入Access DB

我有一個具有多個屬性的對象列表,它是INSERT查詢的值,我想知道我可以將它們全部插入在一起,而不是循環遍歷對象列表,構建查詢字符串並執行查詢由非常緩慢的一個。

的我有什麼粗糙例如:

For Each Val In ValueList 

     ValueString = Val.X.ToString & ", " 
     ValueString += Val.Y.ToString & ", " 
     ValueString += Val.Z.ToString 

     SQLValueList.Add(ValueString) 

    Next 

    Dim cmd As OleDb.OleDbCommand 
    Dim strConnection As String 
    Dim strSql As String = Nothing 

    strConnection = _ 
      "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
      "Data Source=C:\db.accdb;" & _ 
      "User ID=Admin;Password=;" 

    For Each ValueString As String In SQLValueList 

     strSql = "INSERT INTO Results (FldX, FldY, FldZ)" & 
        "VALUES (" & ValueString & ");" 

     cmd = New OleDb.OleDbCommand(strSql) 
     cmd.Connection = New OleDb.OleDbConnection(strConnection) 
     cmd.Connection.Open() 
     cmd.ExecuteNonQuery() 

    Next 

我假設有這樣做的更好的,更有效的方式,但我一直沒能找到它!

回答

3

是參數化查詢

Imports System.Data.OleDb 
....... 

Dim strConnection As String 
Dim strSql As String = Nothing 

strConnection = _ 
     "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
     "Data Source=C:\db.accdb;" & _ 
     "User ID=Admin;Password=;" 

strSql = "INSERT INTO Results (FldX, FldY, FldZ) VALUES (?, ?, ?)" 
using cn = new OleDbConnection(strConnection) 
using cmd = new OleDbCommand(strSql, cn) 
    cn.Open() 
    ' HERE all the parameters are added with a string dummy value. ' 
    ' This should be changed if one of the underlying field is of different type ' 
    ' For example, if FldX is of type integer your need to write ' 
    ' cmd.Parameters.AddWithValue("@p1", 0) and then in the loop code ' 
    ' ' 
    ' cmd.Parameters(0).Value = val.X or ' 
    ' cmd.Parameters(0).Value = Convert.ToInt32(val.X) if val.X is not an integer but convertible to... ' 


    cmd.Parameters.AddWithValue("@p1", "") 
    cmd.Parameters.AddWithValue("@p2", "") 
    cmd.Parameters.AddWithValue("@p3", "") 
    For Each val In ValueList 
     cmd.Parameters(0).Value = val.X.ToString() 
     cmd.Parameters(1).Value = val.Y.ToString() 
     cmd.Parameters(2).Value = val.Z.ToString() 
     cmd.ExecuteNonQuery() 
    Next 
End Using 
End Using 

這只是一個例子,因爲它並不清楚什麼樣的數據存儲在您的值列表(字符串,整數,雙打的日期?),但我希望這個想法清楚了。創建一個帶有3個參數的命令對象(每個字段插入一個參數),用僞值將每個參數添加到命令集合中(在本例中,每個參數都包含一個字符串值,但是您需要爲基礎字段類型添加正確的數據類型)。在這一點上只循環一次你的值並執行查詢。

請遠離字符串連接來構建一個sql命令,特別是當用戶鍵入字符串串聯值時。您冒險Sql Injection attack

+0

感謝您的快速響應!首先,數據是字符串整數和雙精度的組合。我試過了你的代碼,但是我收到一個錯誤:「屬性訪問必須分配給屬性或使用它的值。」在'cmd.parameters [n] .value = val'行上我做錯了什麼? – doovers

+0

正如我所說的,上面的例子假設你的所有字段(FldX,fldY,FldZ)都是數據庫中的文本類型。因此,每個參數都是代碼中的字符串類型。如果這不是真的,那麼你需要使用正確的數據類型。我將爲答案添加一個示例 – Steve

+0

嗯,我仍然得到相同的錯誤...例如'cmd.Parameters [0] .Value =「test」'如果我正確理解你,這是正確的語法還是我錯誤? – doovers