IDataReader.GetSchemaTable 和 DataTable.Clone的区别

本篇的主角是IDataReader.GetSchemaTable,顺便提及容易与之混淆的DataTable.Clone方法。

一、IDataReader.GetSchemaTable

功能:返回一个 DataTable,它描述 IDataReader 的列元数据。

如有表mbr_grade

 

CREATE TABLE `mbr_grade` (
  `grade_id` tinyint(
3 ) unsigned NOT NULL auto_increment COMMENT  ' 瓶主等级ID ' ,
  `grade_nm` 
char ( 32 ) NOT NULL  default   ''  COMMENT  ' 瓶主等级描述 ' ,
  `min_follows` 
int ( 10 ) unsigned NOT NULL  default   ' 0 '  COMMENT  ' 最小关注者数量 ' ,
  `max_follows` 
int ( 10 ) unsigned NOT NULL  default   ' 4294967295 '  COMMENT  ' 最大关注者数量 ' ,
  `given_coin` 
int ( 10 ) unsigned NOT NULL  default   ' 0 '  COMMENT  ' 每月赠送津贴 ' ,
  `mth_clean` tinyint(
3 ) unsigned NOT NULL  default   ' 1 '  COMMENT  ' 是否仅限当月使用有效,赠送帐号余额月末清零 ' ,
  PRIMARY KEY  (`grade_id`)
) ENGINE
= MyISAM DEFAULT CHARSET = gbk;

 

使用IDataReader.GetSchemaTable的代码:

            MySqlConnection con  =   new  MySqlConnection( " Data Source=localhost;User ID=root;Password=***;DataBase=test;Allow Zero Datetime=true;Charset=gbk; " );
            MySqlCommand com 
=   new  MySqlCommand( " select * from mbr_grade where 1=0 " , con);
            con.Open();
            MySqlDataReader reader 
=  com.ExecuteReader();
            
if  (reader != null )
            {
                DataTable dt 
=  reader.GetSchemaTable();
                dt.PrimaryKey 
=   new  DataColumn[] { dt.Columns[ " ColumnName " ] };
                dataGridView1.DataSource 
=  dt.DefaultView;
            }

结果:

IDataReader.GetSchemaTable 和 DataTable.Clone的区别_第1张图片

很明显,返回的datatable是固定框架,每一列的列名都是固定的。而每一行则是数据库实体表的列。

这个函数可以动态获取数据库表结构,比如表的主键,每一列的类型等信息,这样就很方便在数据层做一个通用的数据访问类了。

 

二、DataTable.Clone方法

功能:克隆 DataTable 的结构,包括所有 DataTable 架构和约束。

这个方法也是获取dataTable的结构,跟IDataReader.GetSchemaTable有何区别呢?

同样用上面的表结构做例子,我们试验一下Clone方法。

            MySqlConnection con  =   new  MySqlConnection( " Data Source=localhost;User ID=root;Password=admin;DataBase=test;Allow Zero Datetime=true;Charset=gbk; " );
            MySqlCommand com 
=   new  MySqlCommand( " select * from mbr_grade " , con);
            con.Open();
            MySqlDataReader reader 
=  com.ExecuteReader(CommandBehavior.CloseConnection);
            
if  (reader  !=   null )
            {
                DataTable dt 
=   new  DataTable( " mydt " );
                dt.Load(reader);
                DataTable dtClone 
=  dt.Clone();
                dataGridView1.DataSource 
=  dtClone.DefaultView;
            }


返回的结果如下图:

只是返回了一个空的表而已,而不是表的信息数据。

区别很明显吧,IDataReader.GetSchemaTable是一个非常有用的函数,要想拥有强大而几近万能的数据层类,缺它不可。

你可能感兴趣的:(IDataReader.GetSchemaTable 和 DataTable.Clone的区别)