zoukankan      html  css  js  c++  java
  • 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方法。

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

  • 相关阅读:
    autoreleasepool
    #ifndef/#define/#endif
    类工厂创建单例
    第一篇献给你:Block的回调
    博客纪念日
    [系列教程] Discuz模板的制作方法
    使用Discuz!后台备份和恢复Discuz!站点数据库的方法教程
    discuz x2.5 还原教程
    80后公务员辞职自述:7年收入没涨 能力是听话
    公务员队伍开始动荡了吗?
  • 原文地址:https://www.cnblogs.com/tuyile006/p/1304010.html
Copyright © 2011-2022 走看看