0

VB.net で複数のレコードを Access DB に挿入する最も効率的な方法は何ですか?

クエリの値である複数のプロパティを持つオブジェクトのリストがあり、INSERTオブジェクトのリストをループしてクエリ文字列を作成し、クエリを1つずつ実行する代わりに、それらをすべて一緒に挿入できるかどうかを知りたいです。スロー。

私が持っているものの大まかな例:

    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

これを行うためのはるかに優れた効率的な方法があると思いますが、見つけることができませんでした!

4

1 に答える 1

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

これは、ValueList に格納されているデータの種類 (文字列、整数、倍精度日付など) が明確でないため、単なる例ですが、アイデアが明確であることを願っています。3 つのパラメーター (挿入するフィールドごとに 1 つ) を持つコマンド オブジェクトを作成し、すべてのパラメーターをダミー値を持つコマンド コレクションに追加します (この例では、すべてのパラメーターに文字列値が含まれていますが、基になるフィールド タイプの正しいデータ型を追加する必要があります)。 )。この時点で、値を 1 回ループして、クエリを実行します。

特に連結する文字列値がユーザーによって入力された場合は、SQL コマンドを作成するために文字列を連結しないでください。Sql インジェクション攻撃のリスクがあります

于 2013-10-04T07:15:14.000 に答える