Я давно работаю над приложением 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».
Это снижает общую производительность приложения и вызывает проблемы при извлечении данных. Я просмотрел Google и обнаружил, что «Threading» может быть полезным, но я не могу правильно выполнить Threading. Я не очень знаком с такими вещами. Будет полезно, если вы сможете исправить проблему. Мой первый вызов хранимой процедуры:
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, то проблем нет. Таким образом, возможно сделать отдельное SqlConnection для каждого вызова ExecuteQuery_SP. Если есть сомнения, пожалуйста, прокомментируйте. Спасибо