大家看看这个程序有什么问题,怎么老出错,提示类型转换错误~
在一个数据库的通用类中,把SqlDataReader从数据库读的东西加载到一个DataTable表中:
.....
public DataTable ConverDataReaderToDataTable(SqlDataReader dr)
{
  //add object of DataTable
  DataTable myTable = new DataTable();
  DataTable schemaTable = dr.GetShemaTable();
  //dynamically add to coll
  try
  {//create columns of the table
   foreach(DataRow myRow in schemaTable.Rows)
     {
       DataColumn myCol = new DataColumn();
       myCol.DataType = myRow.GetType();
       MyCol.ColumnName = myRow[0].ToString();
       myTable.Columns.Add(myCol);
       myCol = null;
     }
   while(dr.Read())
   {
     DataRow temRow = myTable.NewRow();
     for(int i =0;i<schemaTable.Rows.Count;i++)
       {
         temRow[i] = dr[i].ToString();
         //the error occur here,program break down
         
        }
      myTable.Rows.Add(temRow);
      temRow = null;
   }
   schemaTable = null;
   dr.Close();
   return myTable;
  }
  catch( Exception ex)
   {
     throw new Exception("Convert Error!",ex);
    }
}
问题就出在了那行:temRow[i] = dr[i].ToString();
大家快看看,问题为什么出在这儿,怎么改进??.....

解决方案 »

  1.   


    temRow[i] = dr[i];
    //the error occur here,program break down
      

  2.   

    楼主理解错了dr.GetSchemaTable()方法的功能了,它返回的是包含如下列的一个Table,没一行记录描述数据表的每一个字段的详细信息:ColumnName ColumnOrdinal ColumnSize NumericPrecision NumericScale ProviderType IsLong AllowDBNull IsReadOnly IsRowVersion IsUnique IsKey IsAutoIncrement BaseSchemaName BaseCatalogName BaseTableName BaseColumnName 
         
      

  3.   

    sorry~ 取消上面的回复,是我看错了~
      

  4.   

    public DataTable ConverDataReaderToDataTable(SqlDataReader dr)
    {
    //add object of DataTable
    DataTable myTable = new DataTable();
    DataTable schemaTable = dr.GetShemaTable();
    //dynamically add to coll
    try
    {//create columns of the table
    /*foreach(DataRow myRow in schemaTable.Rows)
    {
    DataColumn myCol = new DataColumn();
    myCol.DataType = myRow.GetType();
    MyCol.ColumnName = myRow[0].ToString();
    myTable.Columns.Add(myCol);
    myCol = null;
    }*/
    //从列复制列 ,不是由行复制列
    foreach(DataColumn col in schemaTable.Columns){
    DataColumn myCol = new DataColumn();
    myCol.DataType = col.DataType
    MyCol.ColumnName = col.ColumnName
    myTable.Columns.Add(myCol);
    }
    while(dr.Read())
    {
    DataRow temRow = myTable.NewRow();
    for(int i =0;i<schemaTable.Rows.Count;i++)
    {
    temRow[i] = dr[i];
    //the error occur here,program break down}
    myTable.Rows.Add(temRow);}
    dr.Close();
    return myTable;
    }
    catch( Exception ex)
    {
    throw new Exception("Convert Error!",ex);
    }
    }
      

  5.   

    temRow[i] = dr[i].ToString();tostring了,数据类型变成string了
      

  6.   

    //myCol.DataType = myRow.GetType();这行代码不能要
      

  7.   

    //myCol.DataType = myRow.GetType();这行代码不能要myRow.GetType(),得到的是System.Data.DataRow类型;把一个列的类型设置为这个,后面当然就会出错了
      

  8.   

    for(int i =0;i<schemaTable.Rows.Count;i++)
    ==这儿也应该改为以列循环
    for(int i =0;i<schemaTable.Columns.Count;i++)
      

  9.   

    /// <summary>
            /// 将DataReader转换为DataTable
            /// </summary>
            /// <param name="reader">要被转换的DataReader</param>
            /// <returns>转换后的DataTable</returns>
            public static DataTable ConvertDataReaderToDataTable(IDataReader reader)
            {
                DataTable objDataTable = new DataTable();
                int intFieldCount = reader.FieldCount;            //将列名添加到DataTable中
                for (int intCounter = 0; intCounter < intFieldCount; ++intCounter)
                {
                    objDataTable.Columns.Add(reader.GetName(intCounter), reader.GetFieldType(intCounter));
                }            //装入内容
                objDataTable.BeginLoadData();            object[] objValues = new object[intFieldCount];
                while (reader.Read())
                {
                    reader.GetValues(objValues);
                    objDataTable.LoadDataRow(objValues, true);
                }
                reader.Close();
                objDataTable.EndLoadData();            return objDataTable;
            }这个好使,不过是2.0的
      

  10.   

    前面少写了几行代码,就是确保SqlConnection已经Open();大家快看看,这是个数据库中常用的通用方法
      

  11.   

    我认为是字段类型的错误!
    DataColumn myCol = new DataColumn();
           myCol.DataType = myRow.GetType();  //这里定义了字段类型

    DataRow temRow = myTable.NewRow();
         for(int i =0;i<schemaTable.Rows.Count;i++)
           {
             temRow[i] = dr[i].ToString();  //全都转换成了字符串,那么
         //你的myTable每个字段的类型都是字符类型吗?这样添加到myTable的row中,我想当然会出错了!
             //the error occur here,program break down
             
            }
      

  12.   

    七数的方法不对,我试过,提示的错误为:System.FormatException: 输入字符串的格式不正确。
      

  13.   

    谢谢重兄弟,有些方法我都试过,只是十三楼fxqyyzg兄的还没有试,有什么方法,大家在一块多交流一下~错误原因我也知道,就是不明白怎么去改,我现在用的方法是把这个方法给/* **/掉,在用的表的时候,每次都编大量的,几乎同样的代码去加表,用DataTable.Columns.Add("XX",typeof(**)),这种方法累死人,程序还不好维护!
      

  14.   

    while (reader.Read())
                {
                    reader.GetValues(objValues);
                    objDataTable.LoadDataRow(objValues, true);
                }
    改为:
    while(reader.Read())
      {
        for(int i =0;i<intFieldCount;i++)
         {
           objValues[i] = reader.GetValues(i);
         }
         objDataTable.LoadDataRow(objValues, true);  }这样就行了,谢谢~