• 一个经典程序从.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;
      }

  • 相关阅读:
    搭建vue项目脚手架
    vue项目中的iconfont图标下载及配置
    vue-awesome-swiper 轮播图的使用
    IDEA自动生成Mapper和实体文件
    云服务器通过IP如何访问项目
    社保,步入社会的第一步
    Memcached安装与启动
    IDEA提示非法字符,你不懂的UTF-8
    MyEclipse导入eclipse的web项目,将WebRoot切换为WebContent
    Myeclipse2017删除tomcat后,项目全部报错的解决办法
  • 原文地址:https://www.cnblogs.com/EasonWu/p/918107.html
Copyright © 2020-2023  润新知