一个经典程序从.netframework1.0升级到2.0后出现的问题的解决方法

值类型与列类型不匹配
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentException: 值类型与列类型不匹配

源错误:


行 38:      for(int i=0;i<schemaTable.Rows.Count;i++)
行 39:      {
行 40:       myDataRow[i] = dataReader[i].ToString();
行 41:      }
行 42:      datatable.Rows.Add(myDataRow);
 

源文件: d:\\ASP.NET\\办公自动化系统\\App_Code\\Components\\SystemTools.cs    行: 40

堆栈跟踪:


[ArgumentException: 值类型与列类型不匹配]
   System.Data.Common.ObjectStorage.Set(Int32 recordNo, Object value) +971
   System.Data.DataColumn.set_Item(Int32 record, Object value) +34

[ArgumentException: 值类型与列类型不匹配不能在 TreeID 列中存储 <0>。所需类型是 DataRow。]
   System.Data.DataColumn.set_Item(Int32 record, Object value) +71
   System.Data.DataRow.set_Item(DataColumn column, Object value) +276
   System.Data.DataRow.set_Item(Int32 columnIndex, Object value) +25
   OfficeAuto.Components.SystemTools.ConvertDataReaderToDataTable(SqlDataReader dataReader) in d:\\ASP.NET\\办公自动化系统\\App_Code\\Components\\SystemTools.cs:40

[Exception: 转换出错出错!]
   OfficeAuto.Components.SystemTools.ConvertDataReaderToDataTable(SqlDataReader dataReader) in d:\\ASP.NET\\办公自动化系统\\App_Code\\Components\\SystemTools.cs:52
   OfficeAuto.Components.Tree.GetTrees() in d:\\ASP.NET\\办公自动化系统\\App_Code\\Components\\Tree.cs:55
   OfficeAuto.Components.Tree.BindTree(TreeView treeView) in d:\\ASP.NET\\办公自动化系统\\App_Code\\Components\\Tree.cs:16
   OfficeAuto.DesktopModules.LeftTree.BindTreeData() in d:\\ASP.NET\\办公自动化系统\\DesktopModules\\LeftTree.aspx.cs:33
   OfficeAuto.DesktopModules.LeftTree.Page_Load(Object sender, EventArgs e) in d:\\ASP.NET\\办公自动化系统\\DesktopModules\\LeftTree.aspx.cs:26
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +13
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +45
   System.Web.UI.Control.OnLoad(EventArgs e) +80
   System.Web.UI.Control.LoadRecursive() +49
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3750


下面是解决方法:主要是将在1.0中的转化程序改写.

        public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
        {
            /////定义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].ToString();
            //        }
            //        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);
            //} 

改写后的程序如下:

/// <summary>
  /// 将DataReader转为DataTable
  /// </summary>
  /// <param name="DataReader">DataReader</param>
  public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
  {
   ///定义DataTable
   DataTable datatable = new DataTable();

   try
   { ///动态添加表的数据列
    for(int i = 0; i < dataReader.FieldCount; i++)
    {
     DataColumn myDataColumn = new DataColumn();
     myDataColumn.DataType = dataReader.GetFieldType(i);
     myDataColumn.ColumnName = dataReader.GetName(i);
     datatable.Columns.Add(myDataColumn);
    }

    ///添加表的数据
    while(dataReader.Read())
    {
     DataRow myDataRow = datatable.NewRow();
     for(int i = 0; i < dataReader.FieldCount; i++)
     {
      myDataRow[i] = dataReader[i].ToString();
     }
     datatable.Rows.Add(myDataRow);
     myDataRow = null;
    }    
   }
   catch(Exception ex)
   {
    ///抛出类型转换错误
    SystemError.SystemLog(ex.Message);
    throw new SystemException("1004",ex.Message,ex);
   }
   finally
   {
    ///关闭数据读取器
    dataReader.Close();
   }

   return datatable;
  }

原文地址:https://www.cnblogs.com/EasonWu/p/918107.html