[.NET]SqlCommand.ExecuteNonQuery時,發生「在暫止的本機交易中指定命令的連接時,此命令必須具有交易物件才可執行。此命令的 Transaction 屬性尚未進行初始化。」

[.NET]SqlCommand.ExecuteNonQuery時,發生「在暫止的本機交易中指定命令的連接時,此命令必須具有交易物件才可執行。此命令的 Transaction 屬性尚未進行初始化。」

今天幫同事看一個問題,當SqlCommand.ExecuteNonQuery時,會發生以下的錯誤訊息,

類型 'System.InvalidOperationException' 的未處理例外狀況發生於 system.data.dll
其他資訊: 在暫止的本機交易中指定命令的連接時,此命令必須具有交易物件才可執行。此命令的 Transaction 屬性尚未進行初始化。

 

image

 

程式類似如下,

//using System.Data.SqlClient;
SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=RMDB;User Id=rm;Password=ssg;Connect Timeout=15;");
conn.Open();
SqlTransaction myTrans = conn.BeginTransaction();
SqlCommand sqlCmd = new SqlCommand("INSERT INTO t1 (c1) VALUES ('1')", conn);
sqlCmd.Transaction = myTrans;
sqlCmd.ExecuteNonQuery();
conn.ChangeDatabase("RMDB2");
SqlCommand sqlCmd2 = new SqlCommand("INSERT INTO t1 (c1) VALUES ('1')", conn);
sqlCmd2.ExecuteNonQuery();
myTrans.Commit();
conn.Close();

 

原本以為是因為ChangeDatabase所以造成,MSDTC的問題。

後來看到「此命令的 Transaction 屬性尚未進行初始化」,應該是因為該SqlConnection有起交易,而SqlCommand沒有設定Transaction所導致的!

所以將sqlCmd2.Transaction屬性Assign交易物件就可以了(sqlCmd2.Transaction = myTrans;),如下,

//using System.Data.SqlClient;
SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=RMDB;User Id=rm;Password=ssg;Connect Timeout=15;");
conn.Open();
SqlTransaction myTrans = conn.BeginTransaction();
SqlCommand sqlCmd = new SqlCommand("INSERT INTO t1 (c1) VALUES ('1')", conn);
sqlCmd.Transaction = myTrans;
sqlCmd.ExecuteNonQuery();
conn.ChangeDatabase("RMDB2");
SqlCommand sqlCmd2 = new SqlCommand("INSERT INTO t1 (c1) VALUES ('1')", conn);
sqlCmd2.Transaction = myTrans;
sqlCmd2.ExecuteNonQuery();
myTrans.Commit();
conn.Close();

 

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^