在C#中使用SQLite数据库

这篇具有很好参考价值的文章主要介绍了在C#中使用SQLite数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

轻量级桌面程序数据库不太适合用SQLServer、MySQL之类的重量级数据库,嵌入式数据库更好。在对比Access、SQLite、Firebird数据库后发现SQLite较另外两个有较多优点。

环境:.NET Framework 3.5、windows11 64位、Visual Studio 2010. 

C#使用SQLite需要从SQLite官网下载DLL组件。

我是windows11,64位的开发环境,最开始下载的64位的,结果运行时报异常。通过查资料,情况比较复杂(参考:https://blog.51cto.com/xxjjing/5804868),遂重新下载了32位的包:sqlite-netFx35-binary-Win32-2008-1.0.117.0
SQLite版本:1.0.117.0

下载地址:https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

下载后将包解压放到一个固定目录,需要依赖System.Data.SQLite.dll和SQLite.Interop.dll这两个文件,

在项目里右键项目 > 添加引用 > 选“浏览”选项卡,找到解压后的目录,引入System.Data.SQLite.dll,另一个文件SQLite.Interop.dll不可以通过引用方式添加,必须只能复制文件到运行目录下,通过调试发现程序会自动把System.Data.SQLite.dll也复制到运行目录下,System.Data.SQLite.dll和SQLite.Interop.dll文件会在一起。(尝试过直接复制这两个文件到程序的运行目录下不可行,Visual Studio里不管怎么刷新项目的引用列表都不会出现这两个文件,运行会报错。)

 

C# 中使用SQLite示例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.SQLite;

namespace SQLiteTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Console.WriteLine("SQL Lite 数据库试验");
            // 连接数据库,FailIfMissing=false时若文件不存在会自动创建
            string connStr = "Data Source=test.db;Version=3;Pooling=true;FailIfMissing=false;";
            SQLiteConnection conn = new SQLiteConnection(connStr);
            conn.Open();

            //在指定数据库中创建一个table
            string sql = "create table highscores (name varchar(20), score int)";
            SQLiteCommand command = new SQLiteCommand(sql, conn);
            command.ExecuteNonQuery();

            // 插入一些数据
            sql = "insert into highscores (name, score) values ('Me', 3000)";
            command = new SQLiteCommand(sql, conn);
            command.ExecuteNonQuery();

            sql = "insert into highscores (name, score) values ('Myself', 6000)";
            command = new SQLiteCommand(sql, conn);
            command.ExecuteNonQuery();

            sql = "insert into highscores (name, score) values ('And I', 9001)";
            command = new SQLiteCommand(sql, conn);
            command.ExecuteNonQuery();

            // 查询数据
            sql = "select * from highscores order by score desc";
            command = new SQLiteCommand(sql, conn);
            SQLiteDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine("Name: " + reader["name"] + "\tScore: " + reader["score"]);
            }
        }
    }
}

 

 一般建表使用文本文件,不使用代码建(build.sql):

-- 管理员账号表
create table admin (
  id integer primary key,
  admin_account nvarchar(32) not null,
  password nvarchar(32) not null
);
insert into admin (admin_account, password) values ('admin', '123456');

-- 学生表
create table user (
  id integer primary key,
  user_account nvarchar(32) not null,
  user_name nvarchar(32) not null,
  password nvarchar(32) not null,
  create_time timestamp default current_timestamp
);


-- file表
create table file (
  id integer primary key,
  user_account nvarchar(32) not null,
  user_name nvarchar(32) not null,
  file_path nvarchar(256) not null,
  upload_start_time timestamp,
  upload_end_time timestamp,
  upload_ip nvarchar(20),
  file_md5 nvarchar(32),
  file_size integer,
  file_suffix nvarchar(3)
);

-- 文件删除历史表
create table file_remove_history (
  id integer primary key,
  user_account nvarchar(32) not null,
  user_name nvarchar(32) not null,
  file_path nvarchar(256) not null,
  upload_start_time timestamp,
  upload_end_time timestamp,
  upload_ip nvarchar(20),
  file_md5 nvarchar(32),
  file_size integer,
  file_suffix nvarchar(3),
  remove_user nvarchar(20),
  remove_time timestamp default current_timestamp
);

 

从外部文件执行sql

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.SQLite;
using System.IO;

namespace U8FileBackupServer
{
    public partial class Form1 : Form
    {
        
        string dbFile = System.Environment.CurrentDirectory + "\\xxx.db";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            if (!File.Exists(dbFile))
            {
                Console.WriteLine("文件不存在,执行创建。");
                SQLiteConnection.CreateFile(dbFile);
                // 连接数据库,FailIfMissing=false时若文件不存在也会自动创建
                SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbFile + ";Version=3;Pooling=true;FailIfMissing=false;");
                conn.Open(); // 打开连接

                // 建表
                string sqlText = new StreamReader(System.Environment.CurrentDirectory + "\\build.sql").ReadToEnd();
                Console.WriteLine("= = = = = = = = = = = = = = = = = = = = = = = = =");
                Console.WriteLine(sqlText);
                Console.WriteLine("= = = = = = = = = = = = = = = = = = = = = = = = =");
                SQLiteCommand cmd = new SQLiteCommand(sqlText, conn);
                cmd.ExecuteNonQuery();
                conn.Close(); // 关闭连接
            }
            
            SQLiteConnection conn1 = new SQLiteConnection("Data Source=" + dbFile + ";Version=3;Pooling=true;FailIfMissing=true;");
            conn1.Open();
        // 插入一些数据
            string sql = "insert into admin (id, admin_account, password) values ('111', '管理员', 'admin')";
            SQLiteCommand command = new SQLiteCommand(sql, conn1);
            command.ExecuteNonQuery();
        // 查询数据
            sql = "select * from admin";
            command = new SQLiteCommand(sql, conn1);
            SQLiteDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine("admin_account: " + reader["admin_account"] + "\tpassword: " + reader["password"]);
            }
conn1.Close(); } } }

 

自增列

主键字段添加 integer 关键字,insert时会自动生成自增值

create table file (
  id integer primary key,
  ...
);

SQLite插入记录时自增列字段不需要指定值

insert into user (user_account, user_name, password) values ('zhangsan', '张三', '123456')

 

C# 封装 SQLite 工具类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Data;
using System.Data.SQLite;

namespace U8FileBackupServer
{
    /// <summary>
    /// SQLite数据库操作工具类
    /// </summary>
    class DBUtil
    {

        static string dbFile = System.Environment.CurrentDirectory + "\\u8file.db";

        /// <summary>
        /// 检查和初始化数据库
        /// </summary>
        public static void checkAndInitDB()
        {
            if (!File.Exists(dbFile))
            {
                Console.WriteLine("文件不存在,执行创建。");
                SQLiteConnection.CreateFile(dbFile);
                // 连接数据库,FailIfMissing=false时若文件不存在也会自动创建
                SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbFile + ";Version=3;Pooling=true;FailIfMissing=false;");
                conn.Open(); // 打开连接

                // 建表
                string sqlText = new StreamReader(System.Environment.CurrentDirectory + "\\build.sql").ReadToEnd();
                Console.WriteLine("= = = = = = = = = = = = = = = = = = = = = = = = =");
                Console.WriteLine(sqlText);
                Console.WriteLine("= = = = = = = = = = = = = = = = = = = = = = = = =");
                SQLiteCommand cmd = new SQLiteCommand(sqlText, conn);
                cmd.ExecuteNonQuery();
                conn.Close(); // 关闭连接
            }
        }

        /// <summary>
        /// 通用查询方法
        /// 用法:
        /// DataTable result = DBUtil.query("select * from admin");
        /// string username = result[0]["username"];
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static List<Dictionary<string, object>> query(string sql)
        {
            List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbFile + ";Version=3;Pooling=true;FailIfMissing=true;");
            conn.Open();
            SQLiteCommand command = new SQLiteCommand(sql, conn);
            SQLiteDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                Dictionary<string, object> kv = new Dictionary<string, object>();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    kv[reader.GetName(i)] = reader.GetValue(i);
                }
                result.Add(kv);
            }
            command.Dispose();
            conn.Dispose();
            return result;
        }
/// <summary>
     /// 通用修改方法,返回影响的行数 /// </summary> /// <param name="sql"></param> /// <returns></returns> public static int update(string sql) { SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbFile + ";Version=3;Pooling=true;FailIfMissing=true;"); conn.Open(); SQLiteCommand command = new SQLiteCommand(sql, conn); int rowCount = command.ExecuteNonQuery(); command.Dispose(); conn.Dispose(); return rowCount; } } }

 

SQLite中时间的处理

 

存储日期值,建表时可以使用 timestamp 字段,可在建表时通过 default current_timestamp  设置默认值。

create table demo (
  id integer primary key,
  ...
  create_time timestamp default current_timestamp
);

 

在插入数据时候指定timestamp字段的值为当前系统时间(localtime 表示使用本地时区)

insert into demo(create_time) values(datetime(CURRENT_TIMESTAMP, 'localtime'));

 

直接指定timestamp的值

insert into demo(create_time) values('2023-05-27 11:23:45');

 

C#中指定SQLite timestamp的值(如果C#获取时间用了localtime,则sqlite中不能再用)

string sql = "insert into demo(create_time) values(datetime('" + DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + "'));"

 

根据时间作为条件查询

string timeSql = "select * from file where upload_start_time > '2023-05-20 00:00:00' and upload_end_time > '2023-05-27 14:20:00'  order by upload_start_time ";
List<Dictionary<string, object>> data3 = query(timeSql); foreach (Dictionary<string, object> row in data3) {   Console.WriteLine(row["id"] + "\t" + row["user_name"] + "\t" + row["upload_start_time"] + "\t" + row["upload_start_time"] + "\t" + row["upload_end_time"] + "\t" + row["file_size"]); }

也支持betwwen语句

 

查询总数、最大id

List<Dictionary<string, object>> total = query("select count(id) as count from file");
Console.WriteLine("总记录数:" + total.First()["count"]);

List<Dictionary<string, object>> maxid = query("select max(id) as maxid from file");
Console.WriteLine("最大id:" + maxid.First()["maxid"]);
            

 

 分页查询

string timeSql = "select * from file where upload_start_time between '2020-04-20 00:00:00' and '2024-05-20 00:00:00' order by upload_start_time limit 5 Offset 0 ";
List<Dictionary<string, object>> data3 = query(timeSql);
foreach (Dictionary<string, object> row in data3)
{
    Console.WriteLine(row["id"] + "\t" + row["user_name"] + "\t" + row["upload_start_time"] + "\t" + row["upload_start_time"] + "\t" + row["upload_end_time"] + "\t" + row["file_size"]);
}

 

更多参考资料:文章来源地址https://www.toymoban.com/news/detail-422607.html

组件包引用参考:https://blog.csdn.net/wzj0808/article/details/78910457/
执行sql参考:https://www.cnblogs.com/LeeSki/p/14381192.html
SQLite中的字段类型:https://www.cnblogs.com/wjcoding/p/11671335.html

到了这里,关于在C#中使用SQLite数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#轻量级日志功能(只有一个类)

    最近在开发基于.net6的一个数据监控软件,使用其它开源log库都有点麻烦,就想着对Console.WriteLine()方法重定向到文件,非常方便的实现日志记录功能,同时也不影响之前的代码结构。 软件开始的地方要设置该重定向:

    2024年01月21日
    浏览(63)
  • 【HarmonyOS】API6使用storage实现轻量级数据存储

     写在前面 本篇内容基于API6 JS语言进行开发,通过结合轻量级数据存储开发指导的文档,帮助大家完成一个实际的代码案例,通过这个小案例,可以实现简单数据的存储。 参考文档:文档中心 1、页面布局 首先我们编写一个简单的页面布局,页面中只有一个文本和两个按钮

    2024年02月14日
    浏览(38)
  • C#如何使用SQLite数据库?

      SQLite是一个轻量级的嵌入式数据库,它的库文件非常小巧,不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用,如移动设备、嵌入式系统等。与其他数据库管理系统相比,SQLite不需要进行繁琐的配置和管理。它只需要一个文件来存储整个数据库

    2024年02月12日
    浏览(50)
  • 在C#中使用SQLite数据库

    轻量级桌面程序数据库不太适合用SQLServer、MySQL之类的重量级数据库,嵌入式数据库更好。在对比Access、SQLite、Firebird数据库后发现SQLite较另外两个有较多优点。 环境:.NET Framework 3.5、windows11 64位、Visual Studio 2010.  C#使用SQLite需要从SQLite官网下载DLL组件。 我是windows11,64位的

    2023年04月23日
    浏览(33)
  • 【HarmonyOS】轻量级智能穿戴应用如何在页面中实现数据传递与全局变量的使用

    【】 轻量级智能穿戴、LiteWearable、数据传递、全局变量 【问题描述】 开发轻量级智能穿戴LiteWearable应用,在app.js中定义全局变量,在页面中通过this.$app.$def.xxx获取时,报错TypeError: Cannot read property \\\'$def\\\' of undefined 【问题分析】 经确认,LiteWearable暂不支持$def,只要是轻

    2024年02月03日
    浏览(49)
  • 【C# .NET 】使用 Entity Framework Core 操作sqlite数据库

    添加包 EF Core design package   NuGet Gallery | Home 使用用于 EF Core 迁移和现有数据库中的反向工程(基架)的工具需要安装相应的工具包: 可在 Visual Studio 包管理器控制台中使用的 PowerShell 工具的 Microsoft.EntityFrameworkCore.Tools 跨平台命令行工具的 dotnet-ef 和 Microsoft.EntityFramewor

    2024年02月14日
    浏览(51)
  • 使用es实现轻量级分布式锁

    一般来说,实现分布式锁的方式有哪几种? 一:Redisson实现 二:ZK实现   这两种实现网上的实现是千篇一律,在本文就不做过多的讲解了   其它方式好像没有了,真的是这样么?   答案是否定的,今天我就给大家分享一个新的思路,使用es实现一个分布式锁,分布式

    2024年02月06日
    浏览(62)
  • 使用Go语言打造轻量级Web框架

    前言 Web框架是Web开发中不可或缺的组件。它们的主要目标是抽象出HTTP请求和响应的细节,使开发人员可以更专注于业务逻辑的实现。在本篇文章中,我们将使用Go语言实现一个简单的Web框架,类似于Gin框架。 功能 我们的Web框架需要实现以下功能: 路由:处理HTTP请求的路由

    2023年04月08日
    浏览(52)
  • ETLCloud制造业轻量级数据中台解决方案

    制造业在业务发展过程中产生大量的业务交易数据以及设备运行过程中的状态数据,但是制造业有别于其他互联网或零售行业,其数据处理具有以下特点: 数据量不大,大部分业务系统的数据库表在1000W以下 数据结构复杂,数据需要经过很强的清洗和转换才能成为可用的分析

    2024年02月09日
    浏览(36)
  • 树莓派使用Nginx 搭建轻量级网站远程访问

    转载自cpolar极点云文章:树莓派使用Nginx 搭建轻量级网站远程访问 安装 Nginx(发音为“engine-x”)可以将您的树莓派变成一个强大的 Web 服务器,可以用于托管网站或 Web 应用程序。相比其他 Web 服务器,Nginx 的内存占用率非常低,可以在树莓派等资源受限的设备上运行。同时

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包