Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL批量查询插入_Sql_Vb.net - Fatal编程技术网

SQL批量查询插入

SQL批量查询插入,sql,vb.net,Sql,Vb.net,所以我在JsonArray中存储了一个id列表。目前,我正在循环使用id,如下所示: “将ID插入表中” 对于idList中作为Int32的每个用户标识 command.CommandText=“插入用户id(id)值(“&userId&”) command.ExecuteNonQuery()命令 下一个 运行时,根据id列表的大小,它执行大约100个查询。我想做的是使用批量查询,这样我就可以在一个查询中完成所有查询,而不是对数据库执行100个查询。我一直在考虑使用数据集和BulkCopy,但

所以我在JsonArray中存储了一个id列表。目前,我正在循环使用id,如下所示:

“将ID插入表中”
对于idList中作为Int32的每个用户标识
command.CommandText=“插入用户id(id)值(“&userId&”)
command.ExecuteNonQuery()命令
下一个
运行时,根据id列表的大小,它执行大约100个查询。我想做的是使用批量查询,这样我就可以在一个查询中完成所有查询,而不是对数据库执行100个查询。我一直在考虑使用数据集和BulkCopy,但我不确定如何实现它

有更好的解决办法吗

任何帮助都将不胜感激。谢谢。

设置为执行or可能会更有效,但只有大约100行,您是否会看到明显的改进,甚至任何改进都值得怀疑。。。将数据转换为批量插入友好格式所花费的时间很容易超过数据库吞吐量的增加。您还需要权衡代码复杂性的增加和新技术的引入是否会证明您所看到的任何改进是合理的

相反,我只想在循环中保留相同的查询和连接对象,如下所示:

使用cn作为新的SqlConnection(“此处为连接字符串”)_
cmd作为新的SqlCommand(“插入用户标识(id)值(@UserID)”)
cmd.Parameters.Add(“@UserID”,SqlDbType.Integer)
cn.Open()
'将ID插入表中
对于idList中作为Int32的每个用户标识
cmd.Parameters(“@UserID”).Value=UserID
cmd.ExecuteNonQuery()
下一个
终端使用
除了使代码免受sql注入攻击的好处之外,此代码还应该比现有代码更快,因为数据库将能够在循环期间缓存该执行计划,从而在执行单个查询时跳过编译和生成计划步骤

如果此插入定期进行(例如每天一次),您还可以看看这篇关于使用最小日志记录的知识库文章:


我不喜欢使用这样的字符串连接来构建查询。这种技术非常容易受到sql注入攻击,即使这种特殊情况可能(不能保证)是安全的。在将id插入id列表之前,我正在逃跑。所以这不是问题所在。我只是尝试将100个插入转换为一个批处理查询。转义和清理不是一个好方法。您需要通过使用参数化查询隔离数据。好的,这很有意义。所以使用类似于“Parameters.Add”(@id),userId);”的东西。这还有其他好处,我在即将准备好的回答中提到了。我知道,因为它只有大约100个查询,所以不会有太大的区别,但我更想知道如何一次完成所有操作。当执行“command.Parameters(@UserID”)=UserID”时,我会得到错误“无法将“整型”类型的值转换为“System.Data.SqlClient.SqlParameter”