Sql 在Access数据库中插入多条记录
使用VB.net将多条记录插入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 &
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的需求。