事务问题,如何在事务中更新数据后读取数据

cblearn 2008-11-29 05:40:26
刚学C#,想在一个事务中按条件更新一些表记录,更新完后读出数据做些其他动作,不知道怎么处理,下面代码老是报错
public bool delMail(byte vtype, string vidlist)
{
string sql = "";
bool rt = false;
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
conn.Open();

SqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = tran;
cmd.CommandTimeout = 2000;
try
{
sql = "update t_mail set fsenddel=1 where fitemid in (" + vidlist + ")";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();

sql = "select * from t_mail where fsenddel=1 and factdel=1 and fhasannex=1 and fitemid in (" + vidlist + ")";
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
adapter.Fill(ds);
foreach (DataRow row in ds.Tables[0].Rows)
{
string ss =row["fannex"].ToString();
//删除该路径文件
}

tran.Commit();
rt = true;
}
catch(Exception ex)
{
tran.Rollback();
SystemError.SystemLog(ex.Message);
throw new SystemException("1003", ex.Message, ex);
}
finally
{
conn.Close();
}
return rt;
}
...全文
808 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cblearn 2008-11-29
  • 打赏
  • 举报
回复
问题解决了 谢谢!
net5i 2008-11-29
  • 打赏
  • 举报
回复
SqlDataAdapter这个对象执行时,其实是先执行ExecuteReader
获取一个DataReader对象,然后用这个DataReader对象填充DataSet对象,
最后返回DataSet
所以搂主在执行时,必须指定Command
net5i 2008-11-29
  • 打赏
  • 举报
回复
也就是说这样改:

cmd.CommandText = sql;
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;

或者:

cmd.CommandText = sql;
SqlDataAdapter adapter = new SqlDataAdapter(cmd);

然后再adapter.Fill这样才是正确的做法
net5i 2008-11-29
  • 打赏
  • 举报
回复
哦?发现搂主代码还有个问题:

SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);

下面这个属性,搂住设置一下就没问题了
adapter.SelectCommand =

还有,别忘了那个隔离级别
net5i 2008-11-29
  • 打赏
  • 举报
回复
那搂主何不把tran.Commit();
放到 cmd.ExecuteNonQuery(); 下面呢?
Fibona 2008-11-29
  • 打赏
  • 举报
回复
IsolationLevel.ReadUncommitted 改成允许脏读,就是说读的时候可以更新

cblearn 2008-11-29
  • 打赏
  • 举报
回复
错误如下:
如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。
行 220: SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
行 221: DataSet ds = new DataSet();
行 222: adapter.Fill(ds); //这里错了
行 223: foreach (DataRow row in ds.Tables[0].Rows)
行 224: {


源文件: f:\网站\xfwebOA\App_Code\myMail.cs 行: 222

net5i 2008-11-29
  • 打赏
  • 举报
回复
搂主应该把事务的隔离级别IsolationLevel.ReadCommitted改成IsolationLevel.ReadUncommitted
应该能正常

110,549

社区成员

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

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

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