SqlDataReader 转化成DataTablE,在.net FrameWOrk1.1与2。0的不同
如下
如下:
下面是在.net FrameWork 1.14版本下,转化成DataTable方法。
public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
{
DataTable datatable = new DataTable("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);
}
}
{
DataTable datatable = new DataTable("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);
}
}
而在.net FrameWork 2.0就要这样写
public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
{
DataTable datatable = new DataTable("DataTable");
DataTable schemaTable = dataReader.GetSchemaTable();
//动态添加列
try
{
foreach (DataRow myRow in schemaTable.Rows)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = myRow["DataTypeName"].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);
}
}
{
DataTable datatable = new DataTable("DataTable");
DataTable schemaTable = dataReader.GetSchemaTable();
//动态添加列
try
{
foreach (DataRow myRow in schemaTable.Rows)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = myRow["DataTypeName"].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);
}
}
这里面有两句不同
在.net FrameWork1.14中
myDataColumn.DataType = myRow.GetType();
而在.net FrameWork 2.0中
myDataColumn.DataType = myRow["DataTypeName"].GetType();
为什么.net FrameWork 2.0不兼容 .net FrameWork1.14中的语句结构呢.
后来,查看sqlDataReader转化成的架构Table,
发现<
ColumnName | ColumnOrdinal | ColumnSize | NumericPrecision | NumericScale | IsUnique | IsKey | BaseServerName | BaseCatalogName | BaseColumnName | BaseSchemaName | BaseTableName | AllowDBNull | ProviderType | IsAliased | IsExpression | IsIdentity | IsAutoIncrement | IsRowVersion | IsHidden | IsLong | IsReadOnly | DataTypeName | XmlSchemaCollectionDatabase | XmlSchemaCollectionOwningSchema | XmlSchemaCollectionName | UdtAssemblyQualifiedName | NonVersionedProviderType |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
emp_id | 0 | 9 | 255 | 255 | emp_id | 3 | char | 3 | |||||||||||||||||||
fname | 1 | 20 | 255 | 255 | fname | 22 | varchar | 22 | |||||||||||||||||||
minit | 2 | 1 | 255 | 255 | minit | 3 | char | 3 | |||||||||||||||||||
lname | 3 | 30 | 255 | 255 | lname | 22 | varchar | 22 | |||||||||||||||||||
job_id | 4 | 2 | 5 | 255 | job_id | 16 | smallint | 16 | |||||||||||||||||||
job_lvl | 5 | 1 | 3 | 255 | job_lvl | 20 | tinyint | 20 | |||||||||||||||||||
pub_id | 6 | 4 | 255 | 255 | pub_id | 3 | char | 3 | |||||||||||||||||||
hire_date | 7 | 8 | 23 | 3 | hire_date | 4 | datetime | 4 |
我想,在.net FrameWork1.14中那个 myRow.GetType() 返回的是一个row对象,它怎么可以这样用呢。
当我用.net FrameWork2.0时,它却不行了, 出现引用类型和值类型不匹配