本篇的主角是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; }结果:
很明显,返回的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是一个非常有用的函数,要想拥有强大而几近万能的数据层类,缺它不可。
转载于:https://www.cnblogs.com/tuyile006/archive/2008/10/05/1304010.html
相关资源:数据结构—成绩单生成器