2013-10-04 5 views
0

VB.net을 사용하여 Access 데이터베이스에 여러 레코드를 삽입하는 가장 효율적인 방법은 무엇입니까?Access 데이터베이스에 여러 레코드 삽입

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 

내가 거기에이 일을 훨씬 더 효율적 방법입니다하지만 난 그것을 찾을 수 없어 있으리라 믿고있어! 당신의 ValueList (문자열, 정수, 날짜를 두 배로?)에 저장된 데이터의 종류를 명확하지 않기 때문에

답변

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

관련 문제