本篇的主角是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是一个非常有用的函数,要想拥有强大而几近万能的数据层类,缺它不可。