如何同时执行DataAdapter.Fill()

我已经在ASP.Net应用程序上工作了很长时间,并且有10个以上的客户端正在使用该应用程序。但是现在我在应用程序中发现了一个问题,就是说,我有一个存储过程调用,执行该过程大约需要30秒。这不是问题,因为SQL代码非常复杂并且循环很多次。问题是 :  每当执行该存储过程调用时,我将无法使用任何其他功能或存储过程调用。 当我尝试调试时,问题在于'DataAdapter.Fill()'函数正在等待第一个存储过程调用完成。

我执行存储过程调用并返回数据的代码是:

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

所有存储过程调用都通过此函数进行。因此,当我的第一个存储过程调用“ A”正在运行时,直到“ A”完成后,存储过程调用“ B”才会执行。

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

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

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

 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;
        }

我当前的数据库连接打开功能是:

static SqlConnection CON = new SqlConnection();

其中“ CON”是公共SqlConnection变量

{{1}}

我发现了问题,即所有存储过程调用都通过此“ CON”对象执行。如果每个存储过程调用都有单独的SqlConnection对象,则没有问题。 因此,可以为每个ExecuteQuery_SP调用建立单独的SqlConnection。 如有疑问,请发表评论。 谢谢

yuanxiao_001 回答:如何同时执行DataAdapter.Fill()

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

这里是data layers的简介。

,

这里是我可以为您创建的最简单的版本。 重要提示:要了解您的情况,阅读有关异步等待的信息。

您可以从Microsoft C# Async-Await Docs

开始
// TODO set up your connection string
    private string connectionString = "<your connection string>";

    // Gets data assyncronously
    public static async Task<DataTable> GetDataAsync(string procedureName,object[,] ParamArray)
    {
        try
        {
            var asyncConnectionString = new SqlConnectionStringBuilder(connectionString)
            {
                AsynchronousProcessing = true
            }.ToString();

            using (var conn = new SqlConnection(asyncConnectionString))
            {
                using (var SqlCommand = new SqlCommand())
                {
                    SqlCommand.Connection = conn;
                    SqlCommand.CommandText = procedureName;
                    SqlCommand.CommandType = CommandType.StoredProcedure;

                    string ParamName;
                    object ParamValue;
                    for (int i = 0; i < ParamArray.Length / 2; i++)
                    {
                        ParamName = ParamArray[i,0].ToString();
                        ParamValue = ParamArray[i,1];
                        SqlCommand.Parameters.AddWithValue(ParamName,ParamValue);
                    }

                    conn.Open();
                    var data = new DataTable();
                    data.BeginLoadData();
                    using (var reader = await SqlCommand.ExecuteReaderAsync().ConfigureAwait(true))
                    {
                        if (reader.HasRows)
                            data.Load(reader);
                    }
                    data.EndLoadData();
                    return data;
                }
            }
        }
        catch (Exception Ex)
        {
            // Log error or something else
            throw;
        }
    }

    public static async Task<DataTable> GetData(object General,object Type,string FromDate,string ToDate)
    {
        object[,] parArray = new object[,]{
        {"@BranchID",General.BranchID},{"@FinancialYearID",General.FinancialYearID},{"@Type",Type},{"@FromDate",DateTime.ParseExact(FromDate,"dd/MM/yyyy",System.Globalization.CultureInfo.InvariantCulture)},{"@ToDate",DateTime.ParseExact(ToDate,System.Globalization.CultureInfo.InvariantCulture)}
        };

        return await DataBaseHelper.GetDataAsync("SelectOutstandingReportDetailed",parArray);
    }

    // Calls database assyncronously
    private async Task ConsumeData()
    {
        DataTable dt = null;

        try
        {
            // TODO configure your parameters here
            object general = null;
            object type = null;
            string fromDate = "";
            string toDate = "";

            dt = await GetData(general,type,fromDate,toDate);
        }
        catch (Exception Ex)
        {
            // do something if an error occurs
            System.Diagnostics.Debug.WriteLine("Error occurred: " + Ex.ToString());
            return;
        }

        foreach (DataRow dr in dt.Rows)
        {
            System.Diagnostics.Debug.WriteLine(dr.ToString());
        }
    }

    // Fired when some button is clicked. Get and use the data assyncronously,i.e. without blocking the UI.
    private async void button1_Click(object sender,EventArgs e)
    {
        await ConsumeData();
    }
本文链接:https://www.f2er.com/3136535.html

大家都在问