2013-10-04 6 views
0

Каков наиболее эффективный способ вставки нескольких записей в БД доступа с помощью VB.net?Вставить несколько записей в базу данных доступа

У меня есть список объектов с несколькими свойствами, которые являются значениями для запроса 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 

Это просто пример, потому что не ясно, какие данные хранятся в вашем списке значений (строки, целые числа, двойники даты?), Но я надеюсь, что идея чисто. Создайте командный объект с тремя параметрами (по одному для каждого вставляемого поля), добавьте каждый параметр в коллекцию команд с фиктивными значениями (в примере каждый параметр содержит строковое значение, но вам нужно добавить правильный тип данных для базового типа поля). В этот момент просто зациклируйте один раз на свои значения и выполните запрос.

Пожалуйста, избегайте конкатенации строк, чтобы построить команду sql, прежде всего, когда строковые значения для конкатенации набираются вашим пользователем. Вы рискуете Sql Injection attack

+0

Спасибо за быстрый ответ! Во-первых, данные представляют собой сочетание целых чисел и удвоений. Я пробовал ваш код, но я получаю сообщение об ошибке: «Доступ к свойствам должен присваиваться свойству или использовать его значение». на строках 'cmd.parameters [n] .value = val', что я делаю неправильно? – doovers

+0

Как я уже сказал, в приведенном выше примере предполагается, что все ваши поля (FldX, fldY, FldZ) имеют тип текста в базе данных. Таким образом, каждый параметр имеет строку типа в коде. Если это неверно, вам нужно использовать правильный тип данных. Я добавлю пример ответа – Steve

+0

Хмм, я все равно получаю ту же ошибку ... например, 'cmd.Parameters [0] .Value =" test ", если я правильно понимаю, что это правильный синтаксис, или я неправильно? – doovers

Смежные вопросы