我有一个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);
   }}

解决方案 »

  1.   

    changemyDataRow[i] = dataReader[i].ToString();
    ===>
    myDataRow[i] = dataReader[i];
      

  2.   

    楼上正解,可以隐式转换的。
    myDataRow[i] = dataReader[i].ToString();//此行报错
    如果myDataRow[i]是int,在2003里也不会抱错吗???????????
      

  3.   

    如果我new一个datarow呢.
    mydatarow[0]=0;我明明知道他是INT类型的,可他还是报错,郁闷
      

  4.   

    DataColumn myDataColumn = new DataColumn();
    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
      

  5.   

    foreach(DataRow myRow in schemaTable.Rows)
    {
        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);
    }
      

  6.   

    public 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[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);
        }
    }