天天看點

“SqlTransaction 已完成;它再也無法使用”解決方法

大家好,又見面了,我是你們的朋友全棧君。 當隻是使用一次事務時,隻用簡單的事務就可以了

示例代碼:

SqlServerDataBase obj = new SqlServerDataBase();

SqlConnection conn = obj.DBconn();

conn.Open();

SqlTransaction myTrans;

myTrans = conn.BeginTransaction(IsolationLevel.ReadCommitted);

try

{

obj.Insert(“insert into StuInfo (StuNumber,Name,Sex,Specialty) values(‘” + stuNumber + “‘,'” + name + “‘,'” + sex + “‘,'” + specialty + “‘)”, null);

obj.Insert(“insert into StuSkill(StuNumber,Skill) values(‘” + stuNumber + “‘,'” + skill + “‘)”, null);

myTrans.Commit();

Response.Write(“兩條資料均插入到資料庫中!”);

}

catch (Exception ex)

{

try

{

myTrans.Rollback();

}

catch (SqlException sqlEx)

{

if (obj.DBconn() != null)

{

Response.Write(sqlEx.GetType()+”資料庫打開失敗”);

Response.Redirect(“submit.htm”);

}

}

}

finally

{

obj.DBconn().Close();

}

但是設計多個事務處理,比方使用for循環時,處理不當就會産生“SqlTransaction 已完成;它再也無法使用”的問題,主要就是因為SqlTransaction 使用了Commit()後就是不能在使用了,必須重新BeginTransaction()一個。

批處理事務不應該把transaction事務放在for循環裡,造成多個事務,這将導緻錯誤.

應該把for放在transaction裡,當成一個事務來處理,進行批處理

示例代碼:

protected void btnDelete_Click(object sender, EventArgs e) //删除

{

SqlServerDataBase del = new SqlServerDataBase();

string str = “”;

SqlConnection conn = del.DBconn();

conn.Open();

SqlTransaction myTrans;

myTrans = conn.BeginTransaction(IsolationLevel.ReadCommitted);

ListBox1.Items.Clear();

try

{

for (int i = 0; i < GridView1.Rows.Count; i++) //從GridView中選中checkbox

{

GridViewRow row = GridView1.Rows[i];

bool isChecked = ((CheckBox)row.FindControl(“chkSelect”)).Checked;

if (isChecked)

{

ListBox1.Items.Add(GridView1.Rows[i].Cells[2].Text);

//Column 1 is the StuNumber column

str = GridView1.Rows[i].Cells[1].Text; //擷取删除行的StuNumber的值

// Response.Write(str.ToString());

del.Delete(“delete from StuInfo where StuNumber = ‘” + str + “‘”, null);

del.Delete(“delete from StuSkill where StuNumber = ‘” + str + “‘”, null);//删除

}

}

myTrans.Commit();

}

catch (Exception ex)

{

try

{

myTrans.Rollback();

}

catch (SqlException sqlEx)

{

if (del.DBconn() != null)

{

Response.Write(sqlEx.GetType() + “資料庫打開失敗”);

Response.Redirect(“submit.htm”);

}

}

}

finally

{

conn.Close();

}

BindData();

}

}

注意:兩者在使用上是有差別的!

另外在windows服務中,

windows的服務服務正常運作一段時間後,在ontimer中就無法再啟動了,提示:此SqlTransaction已完成;它再也無法使用。

有可能是 timer 時間間隔 太短,造成事務太頻繁!

也可能是Transaction兩次送出的原因,需要注意一下timer的啟用時機。

參考網站:

C#事務的使用、示例及注意事項

http://blog.csdn.net/kiki113/archive/2007/04/29/1591999.aspx

http://topic.csdn.net/u/20070830/10/62719c5d-cb7a-47e5-87a3-89077d82dc77.html

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/143857.html原文連結:https://javaforall.cn