PDA

View Full Version : سوال: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is n



forodo
چهارشنبه 22 بهمن 1393, 11:04 صبح
سلام
من قبلاٌ چندتا تابع داشتم که با هم کاری رو انجام می دادند و خیلی سریع انجام میشد ولی الان که داخل تراکنش قرارشون دادم یکی از تابع هام هست که خیلی دیر انجام میشه و به خاطر همین قضیه اروره زیر رو می ده که یعنی داخل کش می ره و باعث می شه که به من مقدار خالی برگردونه و کل تراکنش رو می ترکونه.
چرا اینجوری شده؟
ارور:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
کدها:
UseDate uddd = new UseDate();
frmFonoshtDesc FonoshtDesc = new frmFonoshtDesc();
FonoshtDesc.Tag = "توضیح صادره";
FonoshtDesc.ShowDialog();
SqlTransaction Transaction;
SqlConnection con = new SqlConnection(clsForms.ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
con.Open();
Transaction = con.BeginTransaction();
cmd.Transaction = Transaction;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
try
{
cmd.CommandText = @"UPDATE tblLetterSadere
SET ControlProzheFinish = 1, FonoshtDesc = N'" + "کنترل پروژه" + "-" + Program.FonoshtDesc + "' WHERE NumberForAC = (SELECT NumberForAC FROM tblLetterSadere WHERE ID = " + Program.LetterID + ")";



cmd.ExecuteNonQuery();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MessageBox.Show(NACFunctionBaygani());
return;
string NumberIdAC = NACFunctionBaygani();
string lvlvevel = CatchLevel();

cmd.CommandText = @"INSERT INTO tblDaryafti(SadereLetterID,ErjaDate,ErjaTime,Level L, NumberForAC
)
VALUES(
@SadereLetterID,@ErjaDate,@ErjaTime,@LevelL, @NumberForAC
)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@SadereLetterID", NumberIdAC);
cmd.Parameters.AddWithValue("@ErjaDate", uddd.GhamariToShamsi());
cmd.Parameters.AddWithValue("@ErjaTime", uddd.TimeEightCharacter());
cmd.Parameters.AddWithValue("@LevelL", lvlvevel + "-" + "بایگانی" + " (اختتام نامه)" + " " + uddd.GhamariToShamsi().ToString() + " " + uddd.TimeEightCharacter().ToString());
cmd.Parameters.AddWithValue("@NumberForAC", NumberIdAC);

cmd.ExecuteNonQuery();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Transaction.Commit();
MessageBox.Show("جریان نامه مورد نظر به اتمام رسید", "ثبت اطلاعات"
, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();

}
catch (Exception)
{
Transaction.Rollback();
MessageBox.Show("در ارتباط با بانک اطلاعاتی مشکلی پیش آمده است", "خطا درون بانک اطلاعاتی", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
finally
{
con.Close();
}
و این هم اون تابعیه که طول می کشه و ارور روی کشش داده میشه:
private string NACFunctionBaygani()
{
SqlConnection objconnection =
new SqlConnection(clsForms.ConnectionString);
try
{
MessageBox.Show(Program.LetterID.ToString());

SqlDataAdapter objDataAdapter = new SqlDataAdapter();
DataSet objDataSet = new DataSet();

objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = objconnection;

objDataAdapter.SelectCommand.CommandText =
@"SELECT NumberForAC
FROM tblLetterSadere
WHERE ID = " + Program.LetterID;


objDataAdapter.SelectCommand.CommandType = CommandType.Text;

objconnection.Open();
objDataAdapter.Fill(objDataSet, "tblLetterSadere");
objconnection.Close();

return objDataSet.Tables["tblLetterSadere"].Rows[0]["NumberForAC"].ToString();
}
catch (Exception)
{
return "";
}
finally
{
objconnection.Close();
}
}

plus
چهارشنبه 22 بهمن 1393, 15:59 عصر
احتمالا مشکل به این خاطره که شما قبل از NACFunctionBaygani با ایجاد Transaction و Update جدول tblLetterSadere، باعث ایجاد Lock روی این جدول میشین. با فراخوانی NACFunctionBaygani و استفاده از Connection جدید، متد Fill شئ objDataAdapter میخواد در جدول tblLetterSadere بنویسه ولی به دلیل وجود Lock منتظر میمونه.
دقیقا متوجه نشدم شما چکار میخواین بکنین ولی فکر میکنم باید متد NACFunctionBaygani رو با همون Connection قبلی اجرا کنید نه اینکه یک Connection جدید ایجاد کنید.

forodo
پنج شنبه 23 بهمن 1393, 03:26 صبح
دستت درد نکنه که جواب دادی.
یعنی چی لاک می کنه؟
مشکل رو برطرف کردم.
به جای
string NumberIdAC = NACFunctionBaygani();
که یه مقداری داخل NumberIdAC ریخته می شد مستقیماً کوئری داخل تابع NACFunctionBaygani رو داخل اینسرت گذاشتم.
یعنی به جای @NumberForAC داخل VALUE کوئری رو قرار دادم و درست شد.
ولی اگه دلیلش رو بدونم چی بود خیلی عالی میشه.

plus
پنج شنبه 23 بهمن 1393, 16:16 عصر
در مورد Transaction و تاثیرش روی قفل شدن جدول ها مطالعه کنید. منظور این هست که کدی که در داخل متد نوشتین و در یک Connection دیگه اجرا میشه، امکان دسترسی به جدولی که در Transaction اول در حال استفاده هست رو نداره و منتظر میمونه تا Transaction اول تموم بشه در صورتی که Transaction اول هم برای اتمام منتظر تموم شدن متد هست. در واقع یک بن بست ایجاد شده.