• 如何利用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 
        
  • 相关阅读:
    [LeetCode] Coin Change
    [LeetCode] House Robber
    [LeetCode] Lowest Common Ancestor of a Binary Search Tree
    [LeetCode] Remove Element
    [LeetCode] Merge Two Sorted Lists
    [LeetCode] Duplicate Emails
    svn propset svn:ignore
    WebLogic11g-负载分发
    WebLogic11g-集群相关概念
    WebLogic11g-半小时让你的domain集群化
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/2387817.html
Copyright © 2020-2023  润新知