Sql 在Access数据库中插入多条记录

Sql 在Access数据库中插入多条记录,sql,vb.net,ms-access,oledb,Sql,Vb.net,Ms Access,Oledb,使用VB.net将多条记录插入Access数据库的最有效方法是什么 我有一个包含多个属性的对象列表,这些属性是INSERT查询的值,我想知道我是否可以将它们全部插入到一起,而不是在对象列表中循环,构建查询字符串并逐个执行查询,这非常慢 我所拥有的粗略示例: For Each Val In ValueList ValueString = Val.X.ToString & ", " ValueString += Val.Y.ToString &

使用VB.net将多条记录插入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

我假设有一个更好、更有效的方法来做这件事,但我一直没能找到

是参数化查询

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个参数的命令对象(每个要插入的字段一个),使用伪值将每个参数添加到命令集合(在本例中,每个参数都包含一个字符串值,但需要为基础字段类型添加正确的数据类型)。此时,只需在值上循环一次并执行查询


请不要使用字符串连接来构建sql命令,尤其是当用户键入要连接的字符串值时。在参数化查询中,您可能会遇到一个

是的问题

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个参数的命令对象(每个要插入的字段一个),使用伪值将每个参数添加到命令集合(在本例中,每个参数都包含一个字符串值,但需要为基础字段类型添加正确的数据类型)。此时,只需在值上循环一次并执行查询


请不要使用字符串连接来构建sql命令,尤其是当用户键入要连接的字符串值时。您冒着风险

感谢您的快速响应!首先,数据是字符串整数和双精度的混合。我尝试了您的代码,但遇到了一个错误:“属性访问必须分配给属性或使用其值。”在
cmd.parameters[n].value=val
行上,我做错了什么?正如我所说,上面的示例假设您的所有字段(FldX、fldY、FldZ)都是数据库中的文本类型。因此,代码中的每个参数都是字符串类型。如果不是这样,则需要使用正确的数据类型。我会给答案加上一个例子嗯,我仍然会得到同样的错误。。。例如
cmd.Parameters[0].Value=“test”
如果我理解正确,这是正确的语法还是我错了?我应该提到我必须在
OleDbConnection
之前添加
OleDbConnection
OleDbCommand
,然后使用
行删除
Dim cmd
行,因为它们给出了错误。除此之外,代码是您编写的…您能告诉我收到的确切错误消息以及您在哪一行收到它吗?对于OleDb,您可以在源文件的开头使用
Imports System.Data.OleDb
,以消除在此命名空间的每个类前面对OleDb的需求。感谢您的快速响应!首先,数据是字符串整数和双精度的混合。我尝试了您的代码,但遇到了一个错误:“属性访问必须分配给属性或使用其值。”在
cmd.parameters[n].value=val
行上,我做错了什么?正如我所说,上面的示例假设您的所有字段(FldX、fldY、FldZ)都是数据库中的文本类型。因此,代码中的每个参数都是字符串类型。如果不是这样,则需要使用正确的数据类型。我会给答案加上一个例子嗯,我仍然会得到同样的错误。。。例如
cmd.Parameters[0].Value=“test”
如果我理解正确,这是正确的语法还是我错了?我应该提到我必须在
OleDbConnection
之前添加
OleDbConnection
OleDbCommand
,然后使用
行删除
Dim cmd
行,因为它们给出了错误。除此之外,代码是您编写的…您能告诉我收到的确切错误消息以及您在哪一行收到它吗?对于OleDb,您可以在源文件的开头使用
Imports System.Data.OleDb
,以消除在此命名空间的每个类前面对OleDb的需求。