如何同时执行DataAdapter.Fill()

问题描述 投票:0回答:1

我已经在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”正在运行时,直到“ A”完成,存储过程调用“ B”才会执行。

这会降低应用程序的整体性能,并导致数据检索出现问题。我浏览了google,发现“线程化”可能会有所帮助,但我无法正确执行线程化。我对这类事情不太熟悉。如果您可以解决此问题,将很有帮助。我的第一个存储过程调用是:

 ds = DB.ExecuteQuery_SP("SelectOutstandingReportDetailed", parArray);

其中ds是DataSet对象。第二个存储过程调用为:

ds = DB.ExecuteQuery_SP("[SelectAccLedgersDetailsByID]", ParamArray);

[如果有任何疑问,请发表评论。谢谢

c# asp.net multithreading stored-procedures dataadapter
1个回答
0
投票

默认情况下,SQL Server将同时允许thousands of connections。这不是问题的根源。您已迫使对存储过程的每次调用都通过一个方法进行传递。排除对存储过程的调用-换句话说,丢失ExecuteQuery_SP方法是一个瓶颈。然后再次测试。

© www.soinside.com 2019 - 2024. All rights reserved.