minaalamshahi
دوشنبه 21 فروردین 1391, 12:01 عصر
با سلام
من لازم داشتم که توی پروژه ام چندین رکورد برای یه کاربر update بشه با چک شرایطی یا اصلا اگه شرایط درست نبود هیچ کدوم انجام نشه
قبل از ورود به transaction شرط رو چک می کنم اگه درست بود وارد transaction میشم و حالا میخوام db برای این کاربر قفل بشه و تمام سطرها براش ویرایش بشه (قفل شدن رو برای این لازم دارم که شخصی که ظرفیت هایی از یک کلاس رو انتخاب کرده اول این کلاس ها برای اون ثبت نهایی بشه و در حین اینکه این کاربر داره کلاس های مورد نظرش رو ثبت نهایی می کنه کاربر دیگه ای اونا رو انتخاب نکنه)
برای همین یه select زدم و تمام سطرهای مربوط به اون رو می گیرم و حالا سطر به سطر می خوام داخل transaction ویرایششون کنم
برای اینکار از دستورات زیر استفاده می کنم
using (TransactionScope transactionScope = new TransactionScope())
{
ds.Clear();
ds=admin.SearchAllHighSelectByTeacherIdIsNotTemp(l ong.Parse(Session["HighTeacherId"].ToString()),long.Parse(Session["HighSetting_Id"].ToString()),out except);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
ErrorCode = admin.ChangeCapacityHighSelect(long.Parse(ds.Table s[0].Rows[i]["HighSchool_Id"].ToString()), long.Parse(ds.Tables[0].Rows[i]["HighCatena_Id"].ToString()), long.Parse(ds.Tables[0].Rows[i]["HighLesson_Id"].ToString()), ds.Tables[0].Rows[i]["HighSelect_Level"].ToString(), long.Parse(ds.Tables[0].Rows[i]["HighTeacher_Id"].ToString()), long.Parse(ds.Tables[0].Rows[i]["HighSetting_Id"].ToString()), out except);
if (ErrorCode == 0)
{
//nothing
}
else
{
State = true;
}
}
if (State == false)
transactionScope.Complete();
}
////////////////////////////
public int ChangeCapacityHighSelect(Int64 HighSchool_Id, Int64 HighCatena_Id, Int64 HighLesson_Id, string HighSelect_Level, Int64 HighTeacher_Id, Int64 HighSetting_Id, out Exception except)
{
int pc = 0;
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Sp_ChangeCapacity";
cmd.Parameters.Clear();
cmd.Parameters.Add("@HighSchool_Id", SqlDbType.BigInt).Value = HighSchool_Id;
cmd.Parameters.Add("@HighCatena_Id", SqlDbType.BigInt).Value = HighCatena_Id;
cmd.Parameters.Add("@HighLesson_Id", SqlDbType.BigInt).Value = HighLesson_Id;
cmd.Parameters.Add("@HighSelect_Level", SqlDbType.NVarChar, 50).Value = HighSelect_Level;
cmd.Parameters.Add("@HighTeacher_Id", SqlDbType.BigInt).Value = HighTeacher_Id;
cmd.Parameters.Add("@HighSetting_Id", SqlDbType.BigInt).Value = HighSetting_Id;
foreach (SqlParameter Parameter in cmd.Parameters)
if (Parameter.Value == null)
Parameter.Value = DBNull.Value;
connection.Open();
pc = int.Parse(cmd.ExecuteScalar().ToString());
Except.Data["code"] = "0";
Except.Data["Error"] = "";
Except.Data["Level"] = "";
}
catch (Exception ee)
{
Except.Data["code"] = "1";
Except.Data["Error"] = ee.Message;
Except.Data["Level"] = "Entity." + sourceName;
}
finally
{
except = Except;
connection.Close();
}
return pc;
}
به خط
connection.Open();
که میرسه exception میده
The operation is not valid for the state of the transaction.
پس چطور ازدستورات مربوط به دیتا بیس در اینجا استفاده کنم
من لازم داشتم که توی پروژه ام چندین رکورد برای یه کاربر update بشه با چک شرایطی یا اصلا اگه شرایط درست نبود هیچ کدوم انجام نشه
قبل از ورود به transaction شرط رو چک می کنم اگه درست بود وارد transaction میشم و حالا میخوام db برای این کاربر قفل بشه و تمام سطرها براش ویرایش بشه (قفل شدن رو برای این لازم دارم که شخصی که ظرفیت هایی از یک کلاس رو انتخاب کرده اول این کلاس ها برای اون ثبت نهایی بشه و در حین اینکه این کاربر داره کلاس های مورد نظرش رو ثبت نهایی می کنه کاربر دیگه ای اونا رو انتخاب نکنه)
برای همین یه select زدم و تمام سطرهای مربوط به اون رو می گیرم و حالا سطر به سطر می خوام داخل transaction ویرایششون کنم
برای اینکار از دستورات زیر استفاده می کنم
using (TransactionScope transactionScope = new TransactionScope())
{
ds.Clear();
ds=admin.SearchAllHighSelectByTeacherIdIsNotTemp(l ong.Parse(Session["HighTeacherId"].ToString()),long.Parse(Session["HighSetting_Id"].ToString()),out except);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
ErrorCode = admin.ChangeCapacityHighSelect(long.Parse(ds.Table s[0].Rows[i]["HighSchool_Id"].ToString()), long.Parse(ds.Tables[0].Rows[i]["HighCatena_Id"].ToString()), long.Parse(ds.Tables[0].Rows[i]["HighLesson_Id"].ToString()), ds.Tables[0].Rows[i]["HighSelect_Level"].ToString(), long.Parse(ds.Tables[0].Rows[i]["HighTeacher_Id"].ToString()), long.Parse(ds.Tables[0].Rows[i]["HighSetting_Id"].ToString()), out except);
if (ErrorCode == 0)
{
//nothing
}
else
{
State = true;
}
}
if (State == false)
transactionScope.Complete();
}
////////////////////////////
public int ChangeCapacityHighSelect(Int64 HighSchool_Id, Int64 HighCatena_Id, Int64 HighLesson_Id, string HighSelect_Level, Int64 HighTeacher_Id, Int64 HighSetting_Id, out Exception except)
{
int pc = 0;
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Sp_ChangeCapacity";
cmd.Parameters.Clear();
cmd.Parameters.Add("@HighSchool_Id", SqlDbType.BigInt).Value = HighSchool_Id;
cmd.Parameters.Add("@HighCatena_Id", SqlDbType.BigInt).Value = HighCatena_Id;
cmd.Parameters.Add("@HighLesson_Id", SqlDbType.BigInt).Value = HighLesson_Id;
cmd.Parameters.Add("@HighSelect_Level", SqlDbType.NVarChar, 50).Value = HighSelect_Level;
cmd.Parameters.Add("@HighTeacher_Id", SqlDbType.BigInt).Value = HighTeacher_Id;
cmd.Parameters.Add("@HighSetting_Id", SqlDbType.BigInt).Value = HighSetting_Id;
foreach (SqlParameter Parameter in cmd.Parameters)
if (Parameter.Value == null)
Parameter.Value = DBNull.Value;
connection.Open();
pc = int.Parse(cmd.ExecuteScalar().ToString());
Except.Data["code"] = "0";
Except.Data["Error"] = "";
Except.Data["Level"] = "";
}
catch (Exception ee)
{
Except.Data["code"] = "1";
Except.Data["Error"] = ee.Message;
Except.Data["Level"] = "Entity." + sourceName;
}
finally
{
except = Except;
connection.Close();
}
return pc;
}
به خط
connection.Open();
که میرسه exception میده
The operation is not valid for the state of the transaction.
پس چطور ازدستورات مربوط به دیتا بیس در اینجا استفاده کنم