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;
}
结果:


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

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



二、DataTable.Clone方法

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

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

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

+展开
-C#
   if (reader != null)
            {
                DataTable dt = new DataTable("mydt");
                dt.Load(reader);
                DataTable dtClone = dt.Clone();
                dataGridView1.DataSource = dtClone.DefaultView;
            }


返回的结果如下图:

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

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

http://www.cnblogs.com/tuyile006/archive/2008/10/05/1304010.html

加支付宝好友偷能量挖...


评论(0)网络
阅读(146)喜欢(0)Asp.Net/C#/WCF