在private void save()
{
conn.Open();
SqlTransaction SaveNewList=obj1.BeginTransaction() ;
SqlCommand cmd = new SqlCommand () ;
cmd.Connection = conn ;
cmd.Transaction = SaveNewList;
try{
string sql="insert into list_head(program,play_date,writer,add_date)"+
"values('"+Program+"','"+PlayDate.ToString()+"','"+Writer+"','"+AddDate+"')";
cmd.CommandText = sql ;
cmd.ExecuteNonQuery ();
} //
//启动事务
//
SaveNewList.Commit();
}
catch(Exception ex)
{
SaveNewList.Rollback(); // 有异常则取消全部操作,回滚事务。
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
在另一个函数中private void delete()
{
conn.Open();
SqlTransaction deleteList=obj1.BeginTransaction() ;
SqlCommand cmd= new SqlCommand () ;
cmd.Connection=obj1;
cmd.Transaction =deleteList;
try
{
string sqlIsExit="select * from list_pick where list_id='"+ID+"' and ns_id='"+_nsId[i]+"'";
DataSet ds= new DataSet () ;
SqlDataAdapter sd= new SqlDataAdapter (sqlIsExit,obj1 );
sd.Fill (ds);
if(ds.Tables[0].Rows.Count!=0)
{
string sql3="update ns_head set picked_num=picked_num-1 where ns_id='"+_nsId[i]+"'";
cmd.CommandText = sql3;
cmd.ExecuteNonQuery ();
}
//
//启动事务
//
deleteList.Commit();}
}
catch(Exception ex)
{
deleteList.Rollback(); // 有异常则取消全部操作,回滚事务。
MessageBox.Show(ex.ToString());
}
finally
{
obj1.Close();
}}单独执行两个函数没有问题,当两个函数同时执行的时候,在sd.Fill (ds);行提示当分配给命令的连接处于挂起的本地事务时,命令必须具有事务对象才能执行,该命令的Transaction属性未初始化。
是哪里的问题呀?
{
conn.Open();
SqlTransaction SaveNewList=obj1.BeginTransaction() ;
SqlCommand cmd = new SqlCommand () ;
cmd.Connection = conn ;
cmd.Transaction = SaveNewList;
try{
string sql="insert into list_head(program,play_date,writer,add_date)"+
"values('"+Program+"','"+PlayDate.ToString()+"','"+Writer+"','"+AddDate+"')";
cmd.CommandText = sql ;
cmd.ExecuteNonQuery ();
} //
//启动事务
//
SaveNewList.Commit();
}
catch(Exception ex)
{
SaveNewList.Rollback(); // 有异常则取消全部操作,回滚事务。
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
在另一个函数中private void delete()
{
conn.Open();
SqlTransaction deleteList=obj1.BeginTransaction() ;
SqlCommand cmd= new SqlCommand () ;
cmd.Connection=obj1;
cmd.Transaction =deleteList;
try
{
string sqlIsExit="select * from list_pick where list_id='"+ID+"' and ns_id='"+_nsId[i]+"'";
DataSet ds= new DataSet () ;
SqlDataAdapter sd= new SqlDataAdapter (sqlIsExit,obj1 );
sd.Fill (ds);
if(ds.Tables[0].Rows.Count!=0)
{
string sql3="update ns_head set picked_num=picked_num-1 where ns_id='"+_nsId[i]+"'";
cmd.CommandText = sql3;
cmd.ExecuteNonQuery ();
}
//
//启动事务
//
deleteList.Commit();}
}
catch(Exception ex)
{
deleteList.Rollback(); // 有异常则取消全部操作,回滚事务。
MessageBox.Show(ex.ToString());
}
finally
{
obj1.Close();
}}单独执行两个函数没有问题,当两个函数同时执行的时候,在sd.Fill (ds);行提示当分配给命令的连接处于挂起的本地事务时,命令必须具有事务对象才能执行,该命令的Transaction属性未初始化。
是哪里的问题呀?
解决方案 »
- C# 做简单的视频编辑。
- C#获取当前IE栏完整地址
- C# 在英文版的操作系统下和中文操作系统下面读取xml文件有没有注意事项,有什么区别?xml的文件格式采用什么格式?
- 请问:如何给程序集添加一个自己的配置文件?
- 怎样设置属性 可透过LABEL看到FORM的背景图片
- 这几本书,大家觉得有用不。
- Interop.Excel和Tools.Excel命名空间有何区别?
- c#内存释放问题--------急急急急急急急
- 我想在一个项目中的基本类里定义加一个ToolTip控件,请问在别的WINFROM里能不能使用这个控件???
- 如何屏蔽鼠标点击事件
- DataGrid如何在winform中实现ASP. NET中的邦定列
- 为什么在InstallShield 10中创建快捷方式不能显示中文?
同一个事物要关联的同一个连接对象;当你调用第一个函数后,你的事务就提交了,而且你的连接对象就关闭了(conn.Close();) 连接关闭后,与该连接对象关联的事务当然也结束了。 可以这样写:
public class Session
{
public Session(SqlConnection connection)
{
this._conn = connection;
}
public SqlTransaction Open()
{
try{ this._conn.Open(); SqlTransaction tran = this._conn.BeginTransaction();}
catch { if( this._conn != null ) this._conn.Close(); throw; }
}
public void Close()
{
if( this._conn != null ) this._conn.Close();
} private SqlConnection _conn;
}public class Demo
{
// 改写你的2个函数
private void save(SqlTransaction tran)
{
SqlCommand cmd = new SqlCommand () ;
cmd.Connection = tran.Connection;
cmd.Transaction = tran;
//...
cmd.ExecuteNonQuery ();
//在这里不要提交事务,不要关闭连接
}
private void delete(SqlTransaction tran)
{
SqlCommand cmd = new SqlCommand () ;
cmd.Connection = tran.Connection;
cmd.Transaction = tran;
//...
cmd.ExecuteNonQuery ();
//在这里不要提交事务,不要关闭连接
}public void TranTest()
{
Session mySession = new Session( new SqlConnection(...) );
SqlTranaction tran = null ;mySesson.Open();
try
{
tran = mySesson.Open();
this.Save( tran );
this.Delete( tran );
tran.Commit();
}
catch
{
if( tran != null ) tran.Rollback();
throw;
}
finally {mySession.Close();}
}
}