2013-10-04 44 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