Sqlite检查表、字段是否存在,不存在则新增

本文介绍如何使用SQLite的系统表sqlite_master来判断指定的表或字段是否存在,并提供代码示例展示如何添加缺失的表和字段。

有些时候我们可能需要在代码中检测某个表或某个表中某个字段是否存在,不存在的情况下通过代码去添加它,该怎么去判断呢 下边一块看一下:

判断表是否存在:

Sqlite会自动维护一个系统表sqlite_master,该表存储了我们所创建的各个table, view, trigger等信息。

select name from sqlite_master where type='table' order by name;
--select count(*) from sqlite_master where type='table' and name='表名'

在这里插入图片描述

判断字段是否存在:

这里有两种方式
第一种:可以清晰的查出表中的字段,在代码中用list接收然后判断list中有没有某个字段

PRAGMA  table_info([tablename])

在这里插入图片描述
第二种:可以通过查询创建表时的sql语句中是否包含某个字段

select * from sqlite_master where type = 'table' and name = 'ACbio' and sql like '%Barcode%'

在这里插入图片描述

新增字段
其中的 column 可以省略,同时也可以不给 default 默认值。

alter table 表名 add column 'asdasd' varchar(20) default 'hahah'
--等同于alter table 表名 add 'asdasd' TEXT

代码操作

public (bool, string) CheckFieldPresenceOrNot(string TableName,string[] Field, DBConnHelper DB,string LocalDBPath) {
            using (IDbConnection db = DB.DBConnection("Sqlite", "", LocalDBPath, ""))
            {
                try
                {
                    string TableSql = $"select count(*) from sqlite_master where type='table' and name='{TableName}' ";
                    int ExistTable= db.ExecuteScalar<int>(TableSql);
                    if (ExistTable<1)
                    {//表不存在则新增表
                        List<string> NeedAddField = new List<string>();
                        for (int i = 0; i < Field.Length; i++)
                        {
                            NeedAddField.Add($"{Field[i]} TEXT");
                        }
                        string FieldStr = string.Join(",", NeedAddField);
                        string AddTableSql = $"create table {TableName}({FieldStr})";
                        db.Execute(AddTableSql);
                        string CreateAfter = $"select count(*) from sqlite_master where type='table' and name='{TableName}'";

                        bool TableAddResult = db.ExecuteScalar<int>(TableSql)>0;

                        if (!TableAddResult) return (false, $"添加本地库新表时失败,请联系管理员");
                        else return (true, "");
                    }

                    List<string> FailureField = new List<string>();
                    for (int i = 0; i < Field.Length; i++)
                    {
                        string Sql = $"PRAGMA  table_info({TableName})";
                        List<TableStructureModel> TableStructure= db.Query<TableStructureModel>(Sql).ToList();
                        bool Exist= TableStructure.Where(a=>a.name==Field[i]).ToList().Count()>0;
                        if (!Exist)
                        {//如果不存在则新增字段
                            string AddField = $"alter table {TableName} add column '{Field[i]}' TEXT";
                            db.Execute(AddField)>0; 
                            //这里新增完之后应该判断一下是否新增成功
                            //。。。。
                        }
                    } 
                    return (true,"");
                }
                catch (Exception ex)
                {
                    Log.Error($"检查新增本地数据表或库字段时失败:{ex.Message + ex.StackTrace + ex.InnerException}");
                    return (false,ex.Message);
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香煎三文鱼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值