sql - 向一个 SQLConnection 发送多个命令

标签 sql database ado.net

我在问一个与 Execute multiple SQL commands in one round trip 有关的问题但不完全一样,因为我在更大范围内遇到这个问题:

我有一个包含许多不同 SQL 命令 (ExecuteNonQuery) 的输入文件,我必须使用 .net 应用程序处理这些命令。 示例:

INSERT INTO USERS (name, password) VALUES (@name, @pw); @name="abc"; @pw="def";
DELETE FROM USERS WHERE name=@name; @name="ghi";
INSERT INTO USERS (name, password) VALUES (@name, @pw); @name="mno"; @pw="pqr";

所有的命令都有参数,所以我想要.net提供的参数机制。但是我的应用程序必须读取这些语句并在可接受的时间跨度内执行它们。一个文件中可能有数千语句。

我的第一个想法是将 SQLCommand 与参数一起使用,因为这确实是正确执行此操作的方法(参数由 .net 转义)但我不能等待每个命令完成 50 毫秒(与 DB 的网络通信服务器, ...)。我需要一种方法来链接命令。

我的第二个想法是自己转义并插入参数,这样我就可以在一个 SQLCommand 中组合多个命令:

INSERT INTO USERS (name, password) VALUES ('abc', 'def'); DELETE FROM USERS WHERE name=@name; @name='ghi'; INSERT INTO USERS (name, password) VALUES ('mno', 'pqr');

但是我确实对这个解决方案感到不安,因为如果有预定义的函数可以执行此操作,我不喜欢自己转义输入。

你会怎么做?谢谢你的回答,克里斯

最佳答案

假设输入中的所有内容都是有效的,我会这样做:

  • 解析出参数名称和值
  • 重写参数名称,使它们在所有查询中都是唯一的(即,这样您就可以在同一批处理中使用 @name 参数执行两个查询)
  • 将一堆查询组合成一个批处理,并在一个事务中运行这些批处理

你(很可能)不能在一个批处理中运行所有这些的原因是因为在一个批处理中有一个参数限制为 2100(至少当我用 SQL Server 做同样的事情时) );根据您获得的性能,您需要调整批处理分离限制。 250-500 最适合我的工作量; YMMV.

不会做的一件事是多线程。如果输入是任意的,程序不知道操作顺序是否重要;因此,您不能开始拆分查询以同时运行。

老实说,只要您能以某种方式向服务器发送查询,您就可能处于良好状态。只有“几千条”语句,整个过程不会花很长时间。 (我编写的应用程序必须使用数百万条语句来执行此操作。)

关于sql - 向一个 SQLConnection 发送多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6699027/

相关文章:

php - 从具有关系的表中检索帖子标签

mysql - SQL脚本-根据excel数据更新表

生成另一个 SQL 查询的 SQL 查询

php - 如何在 Laravel 中更新生产数据库中的数据?

mysql - 简化MySQL查询

c# - Entity Framework - 冗余连接字符串

.net - Entity Framework 5.0 基准测试

c# - 如何在处理 SqlTransaction 之前检查状态

mysql - 如何获取mysql中日期范围内一周中特定天数的计数?

sql - PostgreSQL 分组依据内的窗口函数