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#中完全执行此操作?
或者是否有其他更好的方法来排队存储过程并快速运行它们
您可以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,以便抽象出存储过程的详细信息,并使该过程更易于其他人理解,也更易于维护。如果您添加新的存储过程,或者更改名称等等,事情会变得容易得多。您可以设置一个包含所有委托的静态列表,或者一个包含必要的存储过程详细信息的静态列表,并使用委托仅传递参数。
| 归档时间: |
|
| 查看次数: |
5879 次 |
| 最近记录: |