VS2005下 DataReader 转为 DataTable 遇到困难 解决即揭贴

sqllong 2007-05-15 10:43:34
///定义DataTable和模式
DataTable datatable = new DataTable();
DataTable schemaTable = dataReader.GetSchemaTable();

try
{ ///动态添加表的数据列
foreach (DataRow myRow in schemaTable.Rows)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = myRow.GetType();
myDataColumn.ColumnName = myRow[0].ToString();
datatable.Columns.Add(myDataColumn);
}

///添加表的数据
while (dataReader.Read())
{
DataRow myDataRow = datatable.NewRow();
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
myDataRow[i] = dataReader[i];
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}
schemaTable = null;

///关闭数据读取器
dataReader.Close();
return datatable;
}
catch (Exception ex)
{
///抛出类型转换错误
SystemError.SystemLog(ex.Message);
throw new Exception(ex.Message, ex);
}

在VS2005下,转化的时候出现错误:
"值类型与列类型不匹配不能在 ? 列中存储 <?>。所需类型是 DataRow。"
望解答,解决就揭贴,谢谢大家了
...全文
507 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangye123_hi 2011-07-27
  • 打赏
  • 举报
回复
我也遇到这个问题!已经解决了,谢谢!
sun0201 2007-06-25
  • 打赏
  • 举报
回复
up
wxlwxlwxlwxl 2007-06-25
  • 打赏
  • 举报
回复
如楼上所写,注意类型的转换
lsztzccby 2007-05-17
  • 打赏
  • 举报
回复
DataTable datatable = new DataTable();
DataTable schemaTable = dataReader.GetSchemaTable();
string[] arrlist = new string[schemaTable.Rows.Count];
//动态添加列
try
{
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
DataColumn myDataColumn = new DataColumn();
//image类型不对故做了以下修改(曹保勇)
//myDataColumn.DataType = (Type)schemaTable.Rows[i]["DataType"];
myDataColumn.DataType = System.Type.GetType("System.String");
//image
myDataColumn.ColumnName = schemaTable.Rows[i]["ColumnName"].ToString();
datatable.Columns.Add(myDataColumn);
arrlist[i] = schemaTable.Rows[i]["ColumnName"].ToString();
}
//添加数据
while (dataReader.Read())
{
DataRow myDataRow = datatable.NewRow();
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
if (!Convert.IsDBNull(dataReader[i]))
{
myDataRow[arrlist[i]] = dataReader[arrlist[i]].ToString();
}
else
{
myDataRow[arrlist[i]] = Convert.DBNull;
}
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}
schemaTable = null;
dataReader.Close();
return datatable;
}
catch (Exception ex)
{
//Error.Log(ex.ToString());
throw new Exception("转换出错出错!", ex);
}
sbqcel 2007-05-16
  • 打赏
  • 举报
回复
用不着你再去用1.2里的方法了吧~~
sbqcel 2007-05-16
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5535/5535462.xml?temp=.8925287

对于 ADO.NET 2.0 中的 DataSet 和 DataTable 类的另一个主要增强是,提供了用来消耗 DataReader(将数据加载到 DataTable 中)以及在 DataTable 的内容之上公开 DataReader 的机制。

有时,我们具有(或收到)DataReader 形式的数据,但实际上是希望具有缓存 DataTable 形式的数据。通过新增的 Load 方法,我们可以获得现有的 DataReader,并使用它的内容来填充 DataTable。

有时,我们具有(或收到)缓存形式的数据 (DataTable),并且需要通过 DataReader 类型接口来访问它。通过新增的 GetTableReader 方法,我们可以获得现有的 DataTable,并通过 DataReader 接口和语义来访问它。

在下面的部分中,我们将考察一下这些新方法。

Load 方法 — 基本用法

Load 方法是已经添加到 ADO.NET 2.0 的 DataSet 和 DataTable 中的一个新方法。它用 DataReader 对象的内容加载 DataTable。如果 DataReader 包含多个结果集,则它实际上可以一次加载多个表。

Load 方法的基本用法非常简单:

MyDataTable.Load (MyDataReader)



sbqcel 2007-05-16
  • 打赏
  • 举报
回复
myDataRow[i] = dataReader[i];

这里也是有错误的吧

myDataRow[i] 是DataRow类型的
dataReader[i] 是Object类型的

并且dataReader[i]是第i列的值
sbqcel 2007-05-16
  • 打赏
  • 举报
回复
myDataColumn.ColumnName = myRow[0].ToString();
to:
myDataColumn.ColumnName = myRow["ColumnName"].ToString();

不知你哪行报错哦~

sqllong 2007-05-16
  • 打赏
  • 举报
回复
谢谢-sbqcel(活死人 ━═☆ 吊死在一棵树上的猪!)
问题解决了,想请教下我开始转化的问题出在哪里?
谢谢,找到问题同样散分.
谢谢
chrisky2006 2007-05-15
  • 打赏
  • 举报
回复
myDataRow[i] = dataReader[i]; 好象有问题吧.

110,536

社区成员

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

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

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