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