c# - 如何同时执行 DataAdapter.Fill()
问题描述
我已经在 ASP.Net 应用程序上工作了很长时间,并且有超过 10 个客户端在使用该应用程序。但是现在我在应用程序中发现了一个问题,就是我有一个存储过程调用,大约需要30秒才能执行。这不是问题,因为 SQL 代码高度复杂且循环多次。问题是:每当执行存储过程调用时,我都无法使用任何其他函数或存储过程调用。当我尝试调试时,问题是“DataAdapter.Fill()”函数正在等待第一个存储过程调用完成。
我执行存储过程调用并返回数据的代码是:
public static DataSet ExecuteQuery_SP(string ProcedureName, object[,] ParamArray)
{
SqlDataAdapter DataAdapter = new SqlDataAdapter();
DataSet DS = new DataSet();
try
{
if (CON.State != ConnectionState.Open)
OpenConnection();
SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 0;
cmd.CommandText = ProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = CON;
cmd.Transaction = SqlTrans;
string ParamName;
object ParamValue;
for (int i = 0; i < ParamArray.Length / 2; i++)
{
ParamName = ParamArray[i, 0].ToString();
ParamValue = ParamArray[i, 1];
cmd.Parameters.AddWithValue(ParamName, ParamValue);
}
DataAdapter = new SqlDataAdapter(cmd);
DataAdapter.Fill(DS);
cmd.CommandText = "";
}
catch (Exception ea)
{
}
return DS;
}
所有存储过程调用都通过这个函数工作。因此,当我的第一个存储过程调用“A”正在运行时,存储过程调用“B”在“A”完成之前不会执行。
这会降低应用程序的整体性能并导致数据检索出现问题。我浏览了谷歌,发现“线程”可能会有所帮助,但我无法正确执行线程。我对这类事情不是很熟悉。如果您可以纠正问题,这将很有帮助。我的第一个存储过程调用是:
ds = DB.ExecuteQuery_SP("SelectOutstandingReportDetailed", parArray);
其中 ds 是 DataSet 对象。第二个存储过程调用是:
ds = DB.ExecuteQuery_SP("[SelectAccLedgersDetailsByID]", ParamArray);
我当前的数据库连接打开功能是:
public static bool OpenConnection()
{
try
{
Server = (String)HttpContext.GetGlobalResourceObject("Resource", "Server");
DBName = (String)HttpContext.GetGlobalResourceObject("Resource", "DBName");
UserName = (String)HttpContext.GetGlobalResourceObject("Resource", "UserName");
PassWord = (String)HttpContext.GetGlobalResourceObject("Resource", "PassWord");
string ConnectionString;
ConnectionString = "server=" + Server + "; database=" + DBName + "; uid=" + UserName + "; pwd=" + PassWord + "; Pooling='true';Max Pool Size=100;MultipleActiveResultSets=true;Asynchronous Processing=true";
CON.ConnectionString = ConnectionString;
if (CON.State != ConnectionState.Open)
{
CON.Close();
CON.Open();
}
}
catch (Exception ea)
{
}
return false;
}
其中 'CON' 是一个公共 SqlConnection 变量
static SqlConnection CON = new SqlConnection();
我发现了问题,就是所有的存储过程调用都是通过这个'CON'对象来执行的。如果每个存储过程调用都有单独的 SqlConnection 对象,则没有问题。那么是否可以为每个 ExecuteQuery_SP 调用创建单独的 SqlConnection 。如果有任何疑问,请发表评论。谢谢
解决方案
推荐阅读
- r - 寻找理想的过滤器设置以最大化目标功能
- mysql - Mysql全文搜索没有找到确切的短语
- android - 按钮上的 Kotlin onClickListener 不起作用
- javascript - CSRF 验证失败。请求中止。失败的原因:CSRF 令牌丢失或不正确
- django - 如何在 django 的表单上应用 css
- python-3.x - BERT层的拉取输出和序列输出有什么区别?
- javascript - 在对象的特定属性中添加数据
- uwp-xaml - 创建没有背景、边框和正常、reolver、按下状态的图像的按钮
- jpa - WFLYEJB0406:找不到用于绑定 controller.LoginBean/accountServ 的接口类型为“ejb_accountcrud.IAccountCrud”的 EJB
- powershell - Powershell 脚本自定义对象