错误描述:如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化。
请各位大神帮帮忙,小弟在此谢过啦!
代码如下
protected void btnUpdate_Click(object sender, EventArgs e)
{
DataTable dt = CreateTable();
DataRow dr = dt.NewRow();
dr["tid"] = "1";
dr["tname"] = "xxx";
dr["tupdate"] = DateTime.Now.ToString();
dt.Rows.Add(dr);
UpdateDemo(dt);
Response.Redirect("/Update.aspx");
}
private DataTable CreateTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("tid", typeof(int));
dt.Columns.Add("tname", typeof(string));
dt.Columns.Add("tupdate", typeof(DateTime));
return dt;
}
private int UpdateDemo(DataTable dt)
{
string tableName = "testUpdate";
int res = 0;
using (SqlConnection sqlconn = new SqlConnection(strConn))
{
sqlconn.Open();
//事务
SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
dt.AcceptChanges();
foreach (DataRow dr in dt.Rows)
{
//所有行设为修改状态
dr.SetModified();
}
//为Adapter定位目标表
SqlCommand cmd = new SqlCommand("select * from " + tableName + " where 1=0", sqlconn, tran);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
da.AcceptChangesDuringUpdate = false;
string upSql = @"UPDATE {0} SET [tname]=@tname
,[tupdate]=@tupdate
where tid=@tid ";
upSql = string.Format(upSql, tableName);
SqlCommand updatecmd = new SqlCommand(upSql);
//不修改源DataTable
updatecmd.UpdatedRowSource = UpdateRowSource.None;
da.UpdateCommand = updatecmd;
da.UpdateCommand.Parameters.Add("@tname", SqlDbType.NVarChar, 50, "tname");
da.UpdateCommand.Parameters.Add("@tupdate", SqlDbType.DateTime, 8, "tupdate");
da.UpdateCommand.Parameters.Add("@tid", SqlDbType.Int, 4, "tid");//主键字段
da.UpdateBatchSize = 1000;
res = da.Update(dt);//报错位置
dt.AcceptChanges();
tran.Commit();
sqlconn.Close();
}
catch
{
tran.Rollback();
return -1;
}
}
return res;
}
数据表脚本如下
USE [TestUpdate] GO /****** Object: Table [dbo].[testUpdate] Script Date: 11/29/2014 17:32:44 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[testUpdate]( [tid] [int] NOT NULL, [tname] [nvarchar](50) NULL, [tupdate] [datetime] NULL, CONSTRAINT [PK_testUpdate] PRIMARY KEY CLUSTERED ( [tid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO