ADO.NET事务上处理的问题!!等救命!!!!

henryfan1 2002-08-25 12:33:31
public bool AddOrderData(ref string TableName,string[] Values,ListView.ListViewItemCollection _Items)
{
OleDbCommand _Command=new OleDbCommand();
OleDbTransaction myTrans;
string _Key;
string SQLString="select ID,OrderDate,UnitPrice,OrderCash from TempOrder where id< 0";
DataSet _DataSet=new DataSet();
try
{
_Connection.Open();
//事务开始
myTrans=_Connection.BeginTransaction();
try
{
OleDbDataAdapter _DataAdapter=new OleDbDataAdapter(new OleDbCommand(SQLString,_Connection,myTrans));
_DataAdapter.RowUpdated+= new OleDbRowUpdatedEventHandler(OnRowUpdated);
_DataAdapter.InsertCommand=new OleDbCommand("Insert Into TempOrder(OrderDate,UnitPrice,OrderCash) values(?,?,?)",_Connectio); _DataAdapter.InsertCommand.Parameters.Add("@OrderData",OleDbType.Date,0,"OrderDate");
_DataAdapter.InsertCommand.Parameters.Add("@UnitPrice",OleDbType.Currency,0,"UnitPrice");
_DataAdapter.InsertCommand.Parameters.Add("@OrderCash",OleDbType.Currency,0,"OrderCash");
_DataAdapter.InsertCommand.Transaction=myTrans;
_DataAdapter.Fill(_DataSet,"TempOrder");
DataRow _Row=_DataSet.Tables["TempOrder"].NewRow();
_Row["OrderDate"]=DateTime.Parse(Values[0]);
_Row["UnitPrice"]=Int32.Parse(Values[1]);
_Row["OrderCash"]=Int32.Parse(Values[2]);
_DataSet.Tables["TempOrder"].Rows.Add(_Row);
_DataAdapter.Update(_DataSet,"TempOrder");
_Key=_Row["ID"].ToString();
string TempFields="ID,ComputerNO,StartDate,StartTime";
_Command.Transaction=myTrans;
foreach(ListViewItem tempItem in _Items)
{
SQLString="Inser Into TempOrderComputer(" + TempFields+") Values(";
SQLString+=_Key+","+tempItem.Text+",'"+tempItem.SubItems[1]+"','"+tempItem.SubItems[1]+"')";
_Command.Connection=_Connection;
_Command.CommandText=SQLString;
_Command.ExecuteNonQuery(); }
myTrans.Commit();
}
catch(Exception e_)
{
myTrans.Rollback();
TableName=e_.Message;
return false;
}
/事务结束
_Connection.Close();
}
catch(Exception e_)
{
TableName=e_.Message;
Return false;
}
return true;
}
以上代码在执行到_DataAdaPater.update()时错误
“命令必须具有事务对象才能执行,Transaction属性尚未初始化。”
但是我在InsertCommand中设了事务对像,请大家帮下忙!!!!
我用CommandBuilder也不可以,事务设好了,就是说我没有初始化。
不知是不是我做错了,请帮忙解决一下!!等救命。。。
...全文
69 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wm_djm 2002-09-10
  • 打赏
  • 举报
回复
问题解决了吗?我写了个例子,运行已经通过。
strConn为连接串
ds为数据集



//取数据
ds.Clear();
SqlConnection Conn;
Conn=new SqlConnection(strConn);
Conn.Open();//打开连接
try{
string mySelectQuery="Select * from 用户卡 where 用户编号=1";
SqlCommand myCommand = new SqlCommand(mySelectQuery, Conn);
SqlDataAdapter myAdpter=new SqlDataAdapter(myCommand);
myAdpter.Fill(ds,"用户卡");
mySelectQuery="Select * from 服务卡 where 用户编号=1";
SqlCommand myCommand1 = new SqlCommand(mySelectQuery, Conn);
SqlDataAdapter myAdpter1=new SqlDataAdapter(myCommand1);
myAdpter1.Fill(ds,"服务卡");
}
catch(Exception)
{
MessageBox.Show("Fail");
}
finally
{
Conn.Close();
}

//更新数据(事务)
strConn=DataOp.GetStrConn();
SqlConnection Conn;
Conn=new SqlConnection(strConn);
Conn.Open();//打开连接
SqlTransaction myTrans;
myTrans=Conn.BeginTransaction();
try
{
string mySelectQuery="Select * from 用户卡 where 用户编号=2";
SqlCommand myCommand = new SqlCommand(mySelectQuery, Conn);
SqlDataAdapter myAdpter=new SqlDataAdapter(myCommand);
myCommand.Transaction=myTrans;
SqlCommandBuilder myCommandBuilder=new SqlCommandBuilder(myAdpter);
ds.Tables["用户卡"].Rows[0]["地址"]="中国";
myAdpter.Update(ds,"用户卡");

mySelectQuery="Select * from 服务卡 ";
SqlCommand myCommand1 = new SqlCommand(mySelectQuery, Conn);
SqlDataAdapter myAdpter1=new SqlDataAdapter(myCommand1);
myCommand1.Transaction=myTrans;
SqlCommandBuilder myCommandBuilder1=new SqlCommandBuilder(myAdpter1);
ds.Tables["服务卡"].Rows[0]["服务类型"]="A";
myAdpter1.Update(ds,"服务卡");

myTrans.Commit();
MessageBox.Show("OK");
}
catch(Exception)
{
myTrans.Rollback();
MessageBox.Show("Fail");
}
finally
{
Conn.Close();
}
Tongls 2002-08-31
  • 打赏
  • 举报
回复
bigrongshu(沧海破浪):你说的对当要事务处理时是在提交时,而不是一开始就这样,比如在建立CommandBuilder时等!
dejoy 2002-08-26
  • 打赏
  • 举报
回复
我来学习啦
bigrongshu 2002-08-25
  • 打赏
  • 举报
回复
在ado.net事务处理是针对直接对数据库进行操作这种访问数据的方式(SqlCommand)而言的;

采用dataSet离线数据集的访问数据库方法不可以使用事务;因为事务本来是针对sqlCommand对象而言直接对数据库操作的,

你可以去掉dataSet的东西试验一下

henryfan1 2002-08-25
  • 打赏
  • 举报
回复
myTrans.Commit()是在FOREACH外面的。
关键我在UPDATA时就说,命令没初始化事务。
jtjlww 2002-08-25
  • 打赏
  • 举报
回复
你在foreach中不是用了一个myTrans.Commit()吗,它标志着这个事务已经完成了啊,可以把它写在_Connection.Close();之前看一下,应该是不会再有问题了哟

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧