现在的位置: 首页 > 综合 > 正文

SqlDataReader 转化成DataTablE,在.net FrameWOrk1.1与2。0的不同

2012年03月17日 ⁄ 综合 ⁄ 共 3534字 ⁄ 字号 评论关闭

如下

如下:
下面是在.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);
            }

        }

而在.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);
        }

    }

这里面有两句不同
在.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时,它却不行了, 出现引用类型和值类型不匹配

抱歉!评论已关闭.