是否可以在单个操作中执行许多存储过程?

Jam*_*mes 10 .net c# ado.net stored-procedures

我正在编写读取xml文件来更新数据库.我得到大约500个xml文件,我想尽快处理它们.

所有数据库操作都使用存储过程完成.

每个xml文件都有大约35种不同的存储过程.

最初我写过这样的代码

var cmd = new SqlCommand("EXEC UpdateTeamStats("+teamId+","+points+")");
cmd.CommandType = CommandType.Text;
Run Code Online (Sandbox Code Playgroud)

但在经历了一些最佳实践后,我将其更改为

var cmd = new SqlCommand("UpdateTeamStats");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("teamId", 21);
cmd.Parameters.Add("points", 2);
Run Code Online (Sandbox Code Playgroud)

因为从程序中调用了大量的存储过程,我意识到我必须进行较少数量的调用才能进行优化.

所以我想收集所有35个存储过程并一次执行它们.

存储过程因参数不同而不同,我不知道在上面的参数更改后收集和执行它们的方法.

我正在考虑调用一个巨大的存储过程并在该存储过程中调用另外35个,但我不擅长SQL,这将导致不必要的复杂性.

是否可以在C#中完全执行此操作?

或者是否有其他更好的方法来排队存储过程并快速运行它们

nic*_*s13 0

您可以CommandQueue通过命令模式创建一个 ,并在该命令上创建一个委托,该委托映射到您调用存储过程的任何要求;从外观上看,类似于:

public class CommandQueue
{
    private Connection _connexion = new Connection(); // Set this up somehow.

    // Other methods to handle the concurrency/ calling/ transaction etc.

    public Func<string, Dictionary<string, int>, bool> CallStoredProcedure = (procedureName, parameterValueMap) =>
    {
      cmd.Connection = GetConnexion();
      var cmd = new SqlCommand(procedureName);
      cmd.CommandType = CommandType.StoredProcedure;

      foreach (var parameterValueMapping in parameterValueMap)
      {
        cmd.Parameters.Add(parameterValueMapping.Key, parameterValueMapping.Value);
      }

      var success = cmd.ExecuteNonQuery();

      return success;
    }

    private Connection GetConnexion()
    {
      return _connexion;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,设置CommandQueue,以便您拥有一个线程池,您可以从中调用新线程上的委托,以便它们并行运行。

实际上,查看SQLCommand类,您可以对其进行异步调用。因此,您应该能够异步调用每个存储过程,在每个存储过程完成时设置一个委托,并将其全部包装在一个事务中,以便您可以在需要时通过调用每个命令来回滚它们Cancel()。我可能仍然会使用 aCommandQueue来抽象它,因为我建议您稍后可能会更改它!

我认为我仍然会使用 a 上的委托来封装存储过程调用CommandQueue,以便抽象出存储过程的详细信息,并使该过程更易于其他人理解,也更易于维护。如果您添加新的存储过程,或者更改名称等等,事情会变得容易得多。您可以设置一个包含所有委托的静态列表,或者一个包含必要的存储过程详细信息的静态列表,并使用委托仅传递参数。