C# WPF 桌面应用程序使用 SQlite 数据库

我们在开发 WPF 桌面应用程序时,数据库存的使用是必不可少的,除非你的应用没有数据存储的需求,有了数据存储需求,我们就会面临使用什么样的数据库的选择问题,我的选择方案是,单机版的应用我优先选择 Sqlite,如果钓多台电脑需要数据共享我优先MySql 8.0+,Sqlite 和MySql 都支持标准的SQL 结构查询语句,数据库的切换也不需要额外大量的开发工作。单机版使用Sqlite ,免去 MySql 安装过程,减少用户的操作,降低使用门槛。

之前的很多应用都是使用 MySql 。现在记录下对 Sqlite 数据的基本使用。

准备两张表和C# 实体类,代码如下
cs 复制代码
   public class BaseEntity
    {
        public Int64 id;
        public Int64 Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
    }
cs 复制代码
    //车辆作息
    public class Car : BaseEntity
    {

        public string carNumber;
        public decimal traeWeight;
        public string driver;
        public string driverMobile;

    }
cs 复制代码
    //货物信息 Material   
    public class Marteral :BaseEntity
    {
        public string name;
        public string firstCase;
    }
对应的表结构
sql 复制代码
CREATE TABLE "main"."marteral" (
"id"  INTEGER NOT NULL,
"name"  TEXT(255) DEFAULT NULL,
"first_case"  TEXT(255) DEFAULT NULL,
PRIMARY KEY ("id" ASC)
);

CREATE TABLE "main"."car" (
"id"  bigint NOT NULL,
"car_number"  TEXT(255) DEFAULT NULL,
"trae_weight"  real(10,3) DEFAULT '0.000',
"driver"  TEXT(255) DEFAULT NULL,
"driver_mobile"  TEXT(255) DEFAULT NULL,
"driver_idnumber"  TEXT(255) DEFAULT NULL,
PRIMARY KEY ("id" ASC)
)
;
第一步 在Nuget中 引入 Sqlite的库。

的代码中引入 命名空间

cs 复制代码
using System.Data;
using Microsoft.Data.Sqlite;
第二步 连接Sqlite。
构建连接字符串
cs 复制代码
       /// <summary>
        /// 
        /// </summary>
        /// <param name="file">sqlite databases file </param>
        /// <returns></returns>
        private static string GetConnString(string file)
        {
            var connStr = new SqliteConnectionStringBuilder()
            {
                DataSource = file,
                Pooling = true,
                // 注意 Mode的值 , SqliteOpenMode.ReadWriteCreate表示不存在文件时
                //会自动创建
                Mode = SqliteOpenMode.ReadWriteCreate,
            }.ConnectionString;

            return connStr;
        }
连接
cs 复制代码
      public bool Connection()
        {
            bool res = false;
            //db file is not exist,
            using (SqliteConnection connection = new SqliteConnection(GetConnString(dbfile)))
            {
                if (connection.State != ConnectionState.Open)
                {

                    connection.Open();
                    res = connection.State == ConnectionState.Open;
                }
            }

            return res;
        }
第三步 使用。
添加数据
cs 复制代码
        //各添加10万条数
        private void InsertBtn_Click(object sender, RoutedEventArgs e)
        {
            int total = 100000;

            for (int i = 0; i < total; i++)
            {
                Marteral m = new Marteral()
                {
                    id = i+1,
                    name = "原煤"+i,
                    firstCase = "YM"+i,
                };
                int res = -1;
                if(i% 2 == 0)
                {
                    string sql = SqlBuilder.GetInsertSql(m);

                     res = SqliteHelper.Instance.Insert(sql);
                }
                else
                {
                     res = SqliteHelper.Instance.Insert(m);
                }
               if(res >= 0)
                {
                    Debug.WriteLine($"{m.name} inseert successed;");
                }
                else
                {
                    Debug.WriteLine($"{m.name} inseert errored;");
                }
            }

            for (int i = 0; i < total; i++)
            {
                Car c= new Car()
                {
                    id = i+1,
                    carNumber = "云DDD73" + i,
                    driver = "驾驶员" + i,
                    driverMobile = "1580874631" +i,
                };
                int res = -1;
                if (i % 2 == 0)
                {
                    string sql = SqlBuilder.GetInsertSql(c);

                    res = SqliteHelper.Instance.Insert(sql);
                }
                else
                {
                    res = SqliteHelper.Instance.Insert(c);
                }
                if (res >= 0)
                {
                    Debug.WriteLine($"{c.carNumber} inseert successed;");
                }
                else
                {
                    Debug.WriteLine($"{c.carNumber} inseert errored;");
                }
            }
        }
修改数据
cs 复制代码
        private void UpdateBtn_Click(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {
                Marteral m = new Marteral()
                {
                    id = i + 1,
                    name = "精煤煤" + i,
                    firstCase = "JM" + i,
                };
                int res = -1;
                if (i % 2 == 0)
                {
                    string sql = SqlBuilder.GetUpdateSql(m);

                    res = SqliteHelper.Instance.Update(sql);
                }
                else
                {
                    res = SqliteHelper.Instance.Update(m);
                }
                if (res >= 0)
                {
                    Debug.WriteLine($"{m.name} Update successed;");
                }
                else
                {
                    Debug.WriteLine($"{m.name} Update errored;");
                }
            }

            for (int i = 0; i < 5; i++)
            {
                Car c = new Car()
                {
                    id = i + 1,
                    carNumber = "云AAA73" + i,
                    driver = "驾驶员" + i,
                    driverMobile = "1580874631" + i,
                };
                int res = -1;
                if (i % 2 == 0)
                {
                    string sql = SqlBuilder.GetUpdateSql(c);

                    res = SqliteHelper.Instance.Update(sql);
                }
                else
                {
                    res = SqliteHelper.Instance.Update(c);
                }
                if (res >= 0)
                {
                    Debug.WriteLine($"{c.carNumber} Update successed;");
                }
                else
                {
                    Debug.WriteLine($"{c.carNumber} Update errored;");
                }
            }
        }
删除数据
cs 复制代码
// id % 2 == 0 的数据删除  
private void DeleteBtn_Click(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {
                Marteral m = new Marteral()
                {
                    id = i + 1,
                    name = "精煤煤" + i,
                    firstCase = "JM" + i,
                };
                int res = -1;
                if (i % 2 == 0)
                {
                    string sql = SqlBuilder.GetDeleteSql(m);

                    res = SqliteHelper.Instance.Delete(sql);
                }
              
                if (res >= 0)
                {
                    Debug.WriteLine($"{m.name} Delete successed;");
                }
                else
                {
                    Debug.WriteLine($"{m.name} Delete errored;");
                }
            }

            for (int i = 0; i < 5; i++)
            {
                Car c = new Car()
                {
                    id = i + 1,
                    carNumber = "云AAA73" + i,
                    driver = "驾驶员" + i,
                    driverMobile = "1580874631" + i,
                };
                int res = -1;
                if (i % 2 == 0)
                {
                    string sql = SqlBuilder.GetDeleteSql(c);

                    res = SqliteHelper.Instance.Delete(sql);
                }
              
                if (res >= 0)
                {
                    Debug.WriteLine($"{c.carNumber} Delete successed;");
                }
                else
                {
                    Debug.WriteLine($"{c.carNumber} Delete errored;");
                }
            }
        }
查询并在日志在打印内容
cs 复制代码
      private void SelectBtn_Click(object sender, RoutedEventArgs e)
        {
            string sql = SqlBuilder.GetSelectSql("car", "", "");
            List<Car> cars = SqliteHelper.Instance.Select<Car>(sql);
            cars.ForEach((c) => { Debug.WriteLine(c.carNumber+" trae:"+c.traeWeight); });

            string sql2 = SqlBuilder.GetSelectSql("marteral", "", "");
            List<Marteral> ms = SqliteHelper.Instance.Select<Marteral>(sql2);
            ms.ForEach((m) => { Debug.WriteLine(m.name); });
        }
最后

代码仓库:sqlite_demo: C# WPF 桌面应用程序,数据存储使用Sqlite ,这是一个数据基本操作的基本Demo

感谢各位朋友的阅读,有不足之处,望指正。

相关推荐
hqwest39 分钟前
C#WPF实战出真汁08--【消费开单】--餐桌面板展示
c#·wpf·ui设计·wpf界面设计
orangapple43 分钟前
WPF 打印报告图片大小的自适应(含完整示例与详解)
c#·wpf
异世界贤狼转生码农1 小时前
MongoDB Windows 系统实战手册:从配置到数据处理入门
数据库·mongodb
QuZhengRong2 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
码农阿豪2 小时前
Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
数据库·windows
时序数据说7 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
听雪楼主.11 小时前
Oracle Undo Tablespace 使用率暴涨案例分析
数据库·oracle·架构
我科绝伦(Huanhuan Zhou)11 小时前
KINGBASE集群日常维护管理命令总结
数据库·database
妖灵翎幺11 小时前
Java应届生求职八股(2)---Mysql篇
数据库·mysql
HMBBLOVEPDX11 小时前
MySQL的事务日志:
数据库·mysql