sqldatareader返回数据集,并要求使用ADO.net事务的解决方案

最近遇到一个需求,大致是这样:执行.sql脚本,返回数据集到csv文件,然后把它作为邮件附件发送到若干邮箱。

执行sql语句返回纪录集比较常用的方法,是创建一个SqlDataAdapter对象,一个DataSet对象,然后用SqlDataAdapter对象的fill方法,把结果集fill到DataSet对象中。

但是如果执行的sql语句比较复杂,而且基于某种特定情况下,你无法干预要执行的sql语句的内容。

比如:

Insert into ...

Select ...

Update xxx ...

Select ...

Select ...

 

用上面的方法没有办法使用事务,一旦出错,无法整体回滚。这是个很讨厌的事情。

可以使用如下方法实现:

 

  1.                 SqlCommand cmd = new SqlCommand();
  2.                 
  3.                 SqlTransaction trans =  DataBaseConnection.conn.BeginTransaction();
  4.                 cmd.CommandText = contentText;
  5.                 cmd.Connection = DataBaseConnection.conn;
  6.                 cmd.Transaction = trans;
  7.                 DataSet ds = new DataSet();             
  8.                 try
  9.                 {
  10.                     SqlDataReader sr = cmd.ExecuteReader();                                                            
  11.                     do
  12.                     {
  13.                         DataTable dtrd = ConvertDrToDt(sr);//把sqldatareader转换成datatable
  14.                         ds.Tables.Add(dtrd);
  15.                     }
  16.                     while (sr.NextResult());
  17.                     sr.Close();
  18.                     trans.Commit();                    
  19.                     Console.WriteLine("事务提交成功!");
  20.                 }
  21.                 catch (SqlException ex)
  22.                 {
  23.                     trans.Rollback();
  24.                 }
    1.         /// <summary>
    2.         /// Convert sqldatareader to datatable
    3.         /// </summary>
    4.         /// <param name="dataReader"></param>
    5.         /// <returns></returns>
    6.         public static DataTable ConvertDrToDt(SqlDataReader dataReader)
    7.         {
    8.             int num;
    9.             DataTable table = new DataTable();
    10.             for (num = 0; num < dataReader.FieldCount; num++)
    11.             {
    12.                 DataColumn column = new DataColumn();
    13.                 column.DataType = dataReader.GetFieldType(num);
    14.                 column.ColumnName = dataReader.GetName(num);
    15.                 table.Columns.Add(column);
    16.             }
    17.             while (dataReader.Read())
    18.             {
    19.                 DataRow row = table.NewRow();
    20.                 for (num = 0; num < dataReader.FieldCount; num++)
    21.                 {
    22.                     row[num] = dataReader[num];                   
    23.                 }
    24.                 table.Rows.Add(row);
    25.                 row = null;
    26.             }
    27.             return table;
    28.         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值