请教高手datatable循环写入数据库的事务操作

richardi 2012-10-30 01:29:56

下面这个程序是把一个datatable里面的行,循环插入数据库中,如果某一行插入失败,那么就取消之前的所有插入,所以用到事务,但是我这段代码执行出错。,如果把3行事务操作的代码注释掉,就能执行,应该是事务用法不对,请教如何才能实现整个表插入结束后再提交事务?

错误提示:ExecuteNonQuery requires the command to have a transation when the connection assigned to the command is in a pengding local transation. the transation propery of the command has not been initialized.



private bool ImportFromTable(ref DataTable dt)
{
DBConn db = new DBConn();
SqlConnection con = db.CreateCon();
SqlCommand cmd = new SqlCommand("", con);
SqlTransaction st = null;
try
{
con.Open();
st = con.BeginTransaction();//开始事务

foreach(DataRow dr in dt.Rows)
{
cmd.CommandText = "p_SetItems";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Clear();
cmd.Parameters.Add("@FItemClassID", SqlDbType.Int).Value = this.FItemClassID;
cmd.Parameters.Add("@FMemo", SqlDbType.VarChar).Value = dr[1].ToString().Trim();
cmd.ExecuteNonQuery();

cmd.CommandText = "p_uptParentID";
cmd.Parameters.Clear();
cmd.Parameters.Add("@FParentID", SqlDbType.VarChar).Value = "0";
cmd.Parameters.Add("@FItemClassID", SqlDbType.Int).Value = this.FItemClassID;
cmd.ExecuteNonQuery();
}
st.Commit();//整个table全部写完后提交事务
}
catch (System.Exception ex)
{
st.Rollback();//回滚事务
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
finally
{
con.Close();
}
return true;
}

...全文
202 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyq11 2012-10-30
  • 打赏
  • 举报
回复
使用临时表,或设置标识,所有成果后修改标识或删除
using (TransactionScope scope = new TransactionScope())
{

}
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlCommand comm = new SqlCommand();
SqlTransaction Trans;
Trans = conn.BeginTransaction();
comm.Connection = conn;
comm.Transaction = Trans;
try
{
Trans.Commit();
}
catch
{
Trans.Rollback();
//出现错误,事务回滚!
}
finally
{
}

着魔 2012-10-30
  • 打赏
  • 举报
回复
你的数据库事物没初始化 也就是说事物不知道去打开哪个数据库

看看你的数据库连接字符串什么的
XBodhi. 2012-10-30
  • 打赏
  • 举报
回复
直接。 connection.BeginTransaction

commit;

rollback 就可以了
bluedoctor 2012-10-30
  • 打赏
  • 举报
回复
使用PDF.NET框架吧,它有许多操作DataSet(DataTable)的方法,比如你的问题,可以使用下面的一行代码完成:

PWMIS.DataProvider.Adapter.MyDB.UpdateDataSet(ds);

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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