将多个命令发送到一个SQLConnection

时间:2011-07-14 19:41:46

标签: 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');

但是我对此解决方案感到不安,因为如果有预定义的函数,我不想自己逃避输入。

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

2 个答案:

答案 0 :(得分:0)

有趣的困境.. 我会建议其中任何一个:

  1. 可以控制sql server吗?创建一个加载文件并完成工作的存储过程
  2. 使用sqlcommand,但随后缓存参数,并只读取命令类型(删除,插入等)以及每行执行的值。参数缓存示例hereherehere
  3. 使用多个线程。父线程读取行并将它们发送到其他线程:一个用于执行插入,另一个用于执行删除,或者根据需要执行多个线程。看Tasks

答案 1 :(得分:0)

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

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

您(可能)无法在一个批次中运行此操作的原因是因为单个批处理中的参数限制为2100(至少在我使用SQL Server执行此操作时);根据您获得的性能,您需要调整批次分离限制。 250-500最适合我的工作量; YMMV。

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

老实说,只要你能以某种方式获得服务器的查询,你就可能处于良好的状态。只有“数千”的陈述,整个过程不会花费很长时间。 (我写的应用程序必须用数百万条语句来完成。)