我有一个DataReader转到DataTable的函数,在2003下没有问题,但转到2005时就出下了如下报错:
Exception Details: System.ArgumentException: Type of value has a mismatch with column type
初步认为是DBNull的问题,但不知道怎么解决?
代码如下:
public static DataTable DataReaderToDataTable(SqlDataReader dataReader)
{
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].ToString();//此行报错
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}
schemaTable = null;
dataReader.Close();
return datatable;
}
catch(Exception ex)
{
Error.Log(ex.ToString());
throw new Exception("转换出错了!",ex);
}}
Exception Details: System.ArgumentException: Type of value has a mismatch with column type
初步认为是DBNull的问题,但不知道怎么解决?
代码如下:
public static DataTable DataReaderToDataTable(SqlDataReader dataReader)
{
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].ToString();//此行报错
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}
schemaTable = null;
dataReader.Close();
return datatable;
}
catch(Exception ex)
{
Error.Log(ex.ToString());
throw new Exception("转换出错了!",ex);
}}
===>
myDataRow[i] = dataReader[i];
myDataRow[i] = dataReader[i].ToString();//此行报错
如果myDataRow[i]是int,在2003里也不会抱错吗???????????
mydatarow[0]=0;我明明知道他是INT类型的,可他还是报错,郁闷
myDataColumn.DataType = (Type)myRow["DataType"];
myDataColumn.ColumnName = myRow["ColumnName"].ToString();
datatable.Columns.Add(myDataColumn);
see
http://weblogs.asp.net/rosherove/archive/2004/01/22/61541.aspx
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = myRow.GetType();//这样写的话,myDataColumn.DataType就是DataRow,这不是你的意思吧。
myDataColumn.DataType = myRow[0].GetType();//是不是应该是这样呢?
myDataColumn.ColumnName = myRow[0].ToString();
datatable.Columns.Add(myDataColumn);
}
{
DataTable datatable = new DataTable();
DataTable schemaTable = dataReader.GetSchemaTable();
try
{
foreach(DataRow myRow in schemaTable.Rows)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = myRow[0].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)
{
throw new Exception("error",ex);
}
}