• 如何利用C#代码获取SQLite数据库的元数据


    Sqlite数据库,在很多场合已经用得比较多,由于我的代码生成工具的需要,需要把Sqlite的表、字段、视图等信息获取出来,以便实现各种数据库快速生成项目工程的操作。这里就需要利用C#获取Sqlite数据库的元数据了,和其他数据库一样。

    为了获取Sqlite的数据库对象数据,我做了一个测试的例子来获取他的相关信息,其实它的元数据还是和Access的操作方式很接近。首先我们先通过Sqlite的数据库管理工具或者Visual Studio来打开创建一些表,如下所示。

    首先我们先来看看通过C#代码获取到数据库对象的操作界面,如下所示。

    获取表的元数据界面效果如下所示,视图和这个也查不多,很有意思的一点,就是它把创建的脚本的显示出来了,呵呵。

    获取的表字段信息效果如下所示。

    有了这些数据,我就很方便在我的代码生成工具Database2Sharp里面实现代码生成操作了。

    现在我们来看看以上实现的后台代码是如何的,来了解Sqlite的数据库获取元数据的操作。

            string connectionString = "";
    
            public Form1()
            {
                InitializeComponent();
    
                connectionString = string.Format(@"Data Source={0}\OrderWater.db;Version=3;", Application.StartupPath);
            }
    
            private void btnGetSchema_Click(object sender, EventArgs e)
            {
                using (SQLiteConnection conn = new SQLiteConnection(connectionString))
                {
                    conn.Open();
                    DataTable schemaTable = conn.GetSchema("TABLES");
                    this.dataGridView1.DataSource = schemaTable;
                }
            }
    

    获取表字段的操作代码如下所示。

            private void btnGetColumns_Click(object sender, EventArgs e)
            {
                using (SQLiteConnection conn = new SQLiteConnection(connectionString))
                {
                    conn.Open();
                    DataTable table = conn.GetSchema("TABLES");
                    if (table != null && table.Rows.Count > 0)
                    {
                        string tableName = table.Rows[0]["TABLE_NAME"].ToString();
    
                        DataTable schemaTable = GetReaderSchema(tableName, conn);
                        this.dataGridView1.DataSource = schemaTable;
                    }
                }
            }
    
            private DataTable GetReaderSchema(string tableName, SQLiteConnection connection)
            {
                DataTable schemaTable = null;
                IDbCommand cmd = new SQLiteCommand();
                cmd.CommandText = string.Format("select * from [{0}]", tableName);
                cmd.Connection = connection;
    
                using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly))
                {
                    schemaTable = reader.GetSchemaTable();
                }
                return schemaTable;
            }
    

    为了实现和我代码生成工具中的数据库字段信息绑定,需要通过获取设置Sqlite的属性为对应的ColumnInfo对象,如下所示。

                using (SQLiteConnection conn = new SQLiteConnection(ConnectString))
                {
                    conn.Open();
                    DataTable schemaTable = GetReaderSchema(tableName, conn);
    
                    foreach (DataRow dr in schemaTable.Rows)
                    {
                        ColumnInfo info = new ColumnInfo();
                        info.Name = new NameElement(dr["ColumnName"].ToString());
                        info.Ordinal = Convert.ToInt32(dr["ColumnOrdinal"].ToString());
                        info.AllowDBNull = (bool)dr["AllowDBNull"];
                        info.MaxLength = Convert.ToInt32(dr["ColumnSize"].ToString());
                        info.DataTypeId = Convert.ToInt32(dr["ProviderType"].ToString());
                        info.DataType = dr["DataTypeName"].ToString().Trim();
                        info.AutoIncrement = (bool)dr["IsAutoIncrement"];
                        info.IsPrimaryKey = (bool)dr["IsKey"];
                        info.Unique = (bool)dr["IsUnique"];
                        info.IsReadOnly = (bool)dr["IsReadOnly"];
                        string netType = dr["DataType"].ToString();
    
                        list.Add(info.Name.Name.ToString(), info);
                    }
    
                    conn.Close();
                }
    

    代码生成工具中,这些数据库的元数据实体类信息是可以提供访问的,方便我们定制代码生成工具的模板,代码生成工具关于这些数据库对象的帮助如下所示。

    这样,在代码生成工具中,就可以利用Sqlite的数据库对象数据,来生成和Oracle数据库、SqlServer数据库、Access数据库、MySql等数据库一样的项目工程代码了,获取甚至可以在自定义的模板代码模块中,添加自己的处理逻辑。

    快速生成的代码如下所示。

    本文通过介绍获取Sqlite的数据库元数据库,并在代码生成工具中的应用为例,给大家提供一个使用元数据进行程序开发的一个思路,希望大家可以同这种方式实现更多自定义模板或者逻辑的引用。

    天下虽大同,一直在努力,孜孜不倦,终有所获。

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/2387817.html
Copyright © 2020-2023  润新知