一次往返执行多个SQL命令

tst*_*ter 30 .net c# sql-server ado.net data-access

我正在构建一个应用程序,我想将多个查询批处理到一个数据库的往返.例如,假设单个页面需要显示用户列表,组列表和权限列表.

所以我存储了procs(或者只是简单的sql命令,比如"select*from Users"),我想执行其中的三个.但是,为了填充这一页,我必须进行3次往返.

现在我可以编写单个存储过程("getUsersTeamsAndPermissions")或执行单个SQL命令"select*from Users; exec getTeams; select*from Permissions".

但我想知道是否有更好的方法来指定在一次往返中进行3次操作.好处包括更容易进行单元测试,并允许数据库引擎将查询并行化.

我正在使用C#3.5和SQL Server 2008.

Dar*_*rov 37

这样的东西.这个例子可能不是很好,因为它没有正确处理对象,但你明白了.这是一个清理版本:

using (var connection = new SqlConnection(ConnectionString))
using (var command = connection.CreateCommand())
{
    connection.Open();
    command.CommandText = "select id from test1; select id from test2";
    using (var reader = command.ExecuteReader())
    {
        do
        {
            while (reader.Read())
            {
                Console.WriteLine(reader.GetInt32(0));
            }
            Console.WriteLine("--next command--");
        } while (reader.NextResult());

    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1代码很好的代码.这就是我在单个命令中使用多个sql语句的问题中所讨论的内容. (2认同)

Pat*_*her 9

您提到的单个多部分命令和存储过程选项是两个选项.您无法以这样的方式执行它们,即它们在数据库上"并行化".但是,这两个选项都会导致单次往返,所以你在那里很好.没有办法更有效地发送它们.在sql server 2005及更高版本中,完全参数化的多部分命令非常有效.

编辑:添加有关为什么填写单个呼叫的信息.

虽然你不想太在意减少通话,但可能有正当理由.

  • 我曾经被限制在针对大型机的一个糟糕的ODBC驱动程序,并且每次调用都有1.2秒的开销!我是认真的.有时候我把一些额外的东西塞进我的db调用中.不漂亮.
  • 您也可能发现自己处于必须在某处配置sql查询的情况,并且您不能只进行3次调用:它必须是一个.不应该那样,糟糕的设计,但确实如此.你做你要做的!
  • 有时,将多个步骤封装在存储过程中当然是非常好的.通常不用于保存往返,虽然,但更严格的交易,获取ID为新记录,为限制权限,提供封装,等等等等.(但请不要一直开始使用存储过程.)