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

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

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

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

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

    }
    //货物信息 Material   
    public class Marteral :BaseEntity
    {
        public string name;
        public string firstCase;
    }

 

对应的表结构
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的库。

的代码中引入 命名空间

using System.Data;
using Microsoft.Data.Sqlite;
第二步 连接Sqlite。
构建连接字符串
       /// <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;
        }
连接
      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;
        }
第三步  使用。

        添加数据
        //各添加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;");
                }
            }
        }
        修改数据

        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;");
                }
            }
        }

        删除数据

        

// 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;");
                }
            }
        }
查询并在日志在打印内容

      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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/408067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac安装Appium

一、环境依赖 一、JDK环境二、Android-SDK环境&#xff08;android自动化&#xff09;三、Homebrew环境四、Nodejs 安装cnpm 五、安装appium六、安装appium-doctor来确认安装环境是否完成七、安装相关依赖 二、重头大戏&#xff0c; 配置wda&#xff08;WebDriverAgent&#x…

小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)

C题&#xff1a;C-小苯的IDE括号问题&#xff08;easy&#xff09;_牛客小白月赛87 (nowcoder.com) D题&#xff1a; D-小苯的IDE括号问题&#xff08;hard&#xff09;_牛客小白月赛87 (nowcoder.com) C题代码&#xff1a; #include<bits/stdc.h>using namespace std…

番外篇 | YOLOv5+DeepSort实现行人目标跟踪检测

前言:Hello大家好,我是小哥谈。DeepSort是一种用于目标跟踪的深度学习算法。它结合了目标检测和目标跟踪的技术,能够在视频中准确地跟踪多个目标,并为每个目标分配一个唯一的ID。DeepSort的核心思想是将目标检测和目标跟踪两个任务进行联合训练,以提高跟踪的准确性和稳定性…

Sentinel微服务流量治理组件实战上

目录 分布式系统遇到的问题 解决方案 Sentinel 是什么&#xff1f; Sentinel 工作原理 Sentinel 功能和设计理念 流量控制 熔断降级 Sentinel工作主流程 Sentinel快速开始 Sentinel资源保护的方式 基于API实现 SentinelResource注解实现 Spring Cloud Alibaba整合…

一键生成PDF即刻呈现:轻松创建无忧体验

在信息爆炸的时代&#xff0c;我们每天都在与各种文件、资料打交道。无论是工作中的报告、合同&#xff0c;还是学习中的笔记、论文&#xff0c;如何高效、安全地管理这些珍贵的资料&#xff0c;成为了我们迫切的需求。幸运的是&#xff0c;随着科技的发展&#xff0c;我们不再…

Mysql--索引分类

Mysql--索引分类 1. 索引分类2. 聚集索引&二级索引 1. 索引分类 在MySQL数据库&#xff0c;将索引的具体类型主要分为以下几类&#xff1a;主键索引、唯一索引、常规索引、全文索引。 2. 聚集索引&二级索引 而在在InnoDB存储引擎中&#xff0c;根据索引的存储形式&am…

Mysql运维篇(五) 部署MHA--主机环境配置

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#x…

【算法与数据结构】417、LeetCode太平洋大西洋水流问题

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求雨水既能流向太平洋也能流向大西洋的网格。雨水流向取决于网格的高度。一个比较直接的方式是对…

LangChain Agent v0.2.0简明教程 (中)

4. Retrieval4.1 Document loaders4.2 Text Splitter4.3 Text embedding models4.4 Vector stores4.5 Retrievers4.6 Indexing4. Retrieval 许多LLM需要使用特定用户的外部数据,这些数据不属于模型训练集的一部分。实现这一目标的主要方法是通过检索增强生成(RAG)。在此过程…

window: C++ 获取自己写的dll的地址

我自己用C写了一个插件,插件是dll形式的,我的插件式在dll的目录下有个config文件夹,里面是我用json写的插件配置文件,当插件运行的时候我需要读取到json配置文件,所有最重要的就是如何获取dll的路径. 大概就是这么个结构, 我自己封装了一个函数.只适用于window编程,因为里面用…

【ArcGIS】利用DEM进行水文分析:流向/流量等

利用DEM进行水文分析 ArcGIS实例参考 水文分析通过建立地表水文模型&#xff0c;研究与地表水流相关的各种自然现象&#xff0c;在城市和区域规划、农业及森林、交通道路等许多领域具有广泛的应用。 ArcGIS实例 某流域30m分辨率DEM如下&#xff1a; &#xff08;1&#xff09…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存 1.配置 Total Memory2.JVM 参数3.根据比例限制的组件&#xff08;Capped Fractionated Components&#xff09; Apache Flink 通过严格控制各种组件的内存使用&#xff0c;在 JVM 上提供高效的工作负…

LabVIEW储氢材料循环寿命测试系统

LabVIEW储氢材料循环寿命测试系统 随着氢能技术的发展&#xff0c;固态储氢技术因其高密度和安全性成为研究热点。储氢材料的循环寿命是衡量其工程应用的关键。然而&#xff0c;传统的循环寿命测试设备存在成本高、测试效率低、数据处理复杂等问题。设计了一种基于LabVIEW软件…

SQL-Labs靶场“46-50”关通关教程

君衍. 一、四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入 二、四十七关 ORDER BY单引号报错注入1、源码分析2、报错注入3、时间盲注 三、四十八关 ODRER BY数字型盲注1、源码分析2、rand()盲注3、if语句盲注4、时间盲注…

汽车大灯尾灯灯罩裂了可以修复吗?汽车大灯尾灯裂缝修复用什么胶?拆开的灯罩用什么胶合壳密封?

随着科学技术的不断发展&#xff0c;汽车大灯尾灯破损是可以修的。 TADHE车灯无痕修复专用UV胶是一种经过处理的UV树脂胶&#xff0c;主要成份是改性丙烯酸UV树脂。应用在车灯的专业无痕修复领域。 其具备环氧树脂胶优点的同时&#xff0c;还有如下特点&#xff1a; 固化时间…

独立版表情包小程序完整版源码前后端源码,附带系统搭建教程

搭建要求&#xff1a; 1.系统要求Nginx 1.18.0PHP-7.2mysql5.6&#xff0c;开启 ssl&#xff0c;php需要安装 sg11 扩展 2.设置伪静态 location / { index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s$1; } } location /a…

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; for if max 代码&#xff1a; """ 题目分析&#xff1a;投资额*回报率投资回报 要在可接受范围内选择最优的投资方式获得最大回报最多投资2个理财产品输入&#xff1a; 产品数int; 总投资额int; 总风险int 产品投资…

C#中的dynamic怎么用

在C#中&#xff0c;dynamic 关键字允许您在编译时推迟类型检查&#xff0c;而是将类型检查推迟到运行时。这意味着可以在运行时确定对象的类型&#xff0c;而不是在编译时。这种行为与使用静态类型的编程方式有所不同&#xff0c;因为在编译时会对类型进行检查。 使用 dynamic …

k-means聚类、GMM高斯聚类、canopy聚类、DBSCAN聚类、FCM聚类、ISODATA聚类、k-medoid聚类、层次聚类、谱聚类 对比

k-means聚类、GMM高斯聚类、canopy聚类、DBSCAN聚类、FCM聚类、ISODATA聚类、k-medoid聚类、层次聚类、谱聚类 对比 标 代码获取代码获取代码获取代码获取代码获取代码获取代码获取代码获取代码获取代码获取题 GMM&#xff08;高斯混合模型&#xff09;是一种聚类算法&#xff…

如何在 CentOS 上安装 ONLYOFFICE 文档 8.0

使用社区版&#xff0c;您可以在本地服务器上安装 ONLYOFFICE 文档&#xff0c;并将在线编辑器与 ONLYOFFICE 协作平台或其他热门系统集成在一起。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器&#xff0c;支持处理文本文档、电子表格、演示文稿、可填写…