sqldatareader返回数据集,并要求使用ADO.net事务的解决方案
2008-10-27 14:09
633 查看
最近遇到一个需求,大致是这样:执行.sql脚本,返回数据集到csv文件,然后把它作为邮件附件发送到若干邮箱。
执行sql语句返回纪录集比较常用的方法,是创建一个SqlDataAdapter对象,一个DataSet对象,然后用SqlDataAdapter对象的fill方法,把结果集fill到DataSet对象中。
但是如果执行的sql语句比较复杂,而且基于某种特定情况下,你无法干预要执行的sql语句的内容。
比如:
Insert into ...
Select ...
Update xxx ...
Select ...
Select ...
用上面的方法没有办法使用事务,一旦出错,无法整体回滚。这是个很讨厌的事情。
可以使用如下方法实现:
SqlCommand cmd = new SqlCommand();
SqlTransaction trans = DataBaseConnection.conn.BeginTransaction();
cmd.CommandText = contentText;
cmd.Connection = DataBaseConnection.conn;
cmd.Transaction = trans;
DataSet ds = new DataSet();
try
{
SqlDataReader sr = cmd.ExecuteReader();
do
{
DataTable dtrd = ConvertDrToDt(sr);//把sqldatareader转换成datatable
ds.Tables.Add(dtrd);
}
while (sr.NextResult());
sr.Close();
trans.Commit();
Console.WriteLine("事务提交成功!");
}
catch (SqlException ex)
{
trans.Rollback();
}
/// <summary>
/// Convert sqldatareader to datatable
/// </summary>
/// <param name="dataReader"></param>
/// <returns></returns>
public static DataTable ConvertDrToDt(SqlDataReader dataReader)
{
int num;
DataTable table = new DataTable();
for (num = 0; num < dataReader.FieldCount; num++)
{
DataColumn column = new DataColumn();
column.DataType = dataReader.GetFieldType(num);
column.ColumnName = dataReader.GetName(num);
table.Columns.Add(column);
}
while (dataReader.Read())
{
DataRow row = table.NewRow();
for (num = 0; num < dataReader.FieldCount; num++)
{
row[num] = dataReader[num];
}
table.Rows.Add(row);
row = null;
}
return table;
}
执行sql语句返回纪录集比较常用的方法,是创建一个SqlDataAdapter对象,一个DataSet对象,然后用SqlDataAdapter对象的fill方法,把结果集fill到DataSet对象中。
但是如果执行的sql语句比较复杂,而且基于某种特定情况下,你无法干预要执行的sql语句的内容。
比如:
Insert into ...
Select ...
Update xxx ...
Select ...
Select ...
用上面的方法没有办法使用事务,一旦出错,无法整体回滚。这是个很讨厌的事情。
可以使用如下方法实现:
SqlCommand cmd = new SqlCommand();
SqlTransaction trans = DataBaseConnection.conn.BeginTransaction();
cmd.CommandText = contentText;
cmd.Connection = DataBaseConnection.conn;
cmd.Transaction = trans;
DataSet ds = new DataSet();
try
{
SqlDataReader sr = cmd.ExecuteReader();
do
{
DataTable dtrd = ConvertDrToDt(sr);//把sqldatareader转换成datatable
ds.Tables.Add(dtrd);
}
while (sr.NextResult());
sr.Close();
trans.Commit();
Console.WriteLine("事务提交成功!");
}
catch (SqlException ex)
{
trans.Rollback();
}
/// <summary>
/// Convert sqldatareader to datatable
/// </summary>
/// <param name="dataReader"></param>
/// <returns></returns>
public static DataTable ConvertDrToDt(SqlDataReader dataReader)
{
int num;
DataTable table = new DataTable();
for (num = 0; num < dataReader.FieldCount; num++)
{
DataColumn column = new DataColumn();
column.DataType = dataReader.GetFieldType(num);
column.ColumnName = dataReader.GetName(num);
table.Columns.Add(column);
}
while (dataReader.Read())
{
DataRow row = table.NewRow();
for (num = 0; num < dataReader.FieldCount; num++)
{
row[num] = dataReader[num];
}
table.Rows.Add(row);
row = null;
}
return table;
}
相关文章推荐
- ADO.NET 開發高手線上教學課程第六集 - 如何使用資料讀取器 (SqlDataReader)
- ADO.NET访问数据库-SqlCommand的ExecuteReader方法一般配合sqldatareader使用
- ADO.NET数据库操作------SqlDataReader和SqlDataAdapter 区别
- Silverlight + WCF使用Linq to SQL以及ADO.NET Entity Data Model更新数
- ADO.NET学习之防止SQL注入,存储过程,SqlDataReader
- 黑马程序员之ADO.NET学习笔记:SqlDataReader和SqlDataAdapter 区别
- 简述ADO.NET中的SqlDataReader对象
- c# .net使用SqlDataReader注意的几点----转
- ADO.NET基础必备之SqlDataReader 类
- asp.net中SqlDataReader使用时关闭数据库连接的问题(转)
- C# / MSSQL / WinForm / ASP.NET - SQLHelper中返回SqlDataReader数据
- ADO.NET - 1.基础(SqlCommand\ExecuteScalar\ExecuteReader\sqlDataAdapter)
- 使用SqlDataReader应该注意的问题,使用datareader没有获取到分页的output值【来自Mist .NET blog】
- 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )
- 分别使用ADO.Net Entity Data Model 和Linq to Sql 建立数据访问层
- 黑马程序员_学习日记47_615数据库开发及ADO.Net(连接字符串、SqlDataReader对象、连接池)
- ADO.NET基础01(ADO.NET组成,数据库的方式,SqlCommand,SqlDataReader)
- ASP.NET 3.5核心编程学习笔记(12):SqlCommand、SqlDataReader、事务
- Winform使用ADO.NET的SqlDataAdapter更新多表数据
- ADO.NET 主要的三个对象(SqlConnection/SqlCommand/SqlDataReader)