首页 > 数据库 >C# 内嵌数据库 SQLite

C# 内嵌数据库 SQLite

时间:2025-01-04 17:57:31浏览次数:6  
标签:内嵌 SQLite C# 数据库 System command using new

最近,看到一个软件,软件是使用的内嵌数据库。我对这个东西没有实践过,今天突然想亲手做一做!。关于SQLIte的资料我就不多说了,网上都有。我自己也整理了一部分,基本上可以对SQLite有个全面的了解了。我这里就不废话了,直接上我自己的代码。

1:首先要先下载一个SQLite的C#开发的支持的东西。下载地址:sqllite下载地址:tp://sourceforge.net/projects/sqlite-dotnet2/files/SQLite%20for%20ADO.NET%202.0/1.0.66.0/SQLite-1.0.66.0-setup.exe/download

点击下载后,安装就行。(注意:安装的时候最好不要开着vs2008)

2:打开vs2008,新建一个winform应用程序

3: 打开“服务器资源管理器” 在这里右击“数据连接”---->添加连接 ------》更改 -----》更改数据源为:“SQLLite Database FIle“----->确定 ---->Browse选择你的数据库,(注意选择的文件一定是以后缀“.db”结束的,如果你还没建库,那么你就随便建一个以后缀为"db"结束的文件,放到你项目的bin目录的debug中(很重要,程序发布的路径)) 

我从网上当的一个SQLite helper 根本就用不成,经过我的修补终于可以用了。

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.SQLite;
namespace DAL
{
    public class SQLiteHelper
    {
        /// <summary>
        /// 获得连接对象
        /// </summary>
        /// <returns></returns>
        public static SQLiteConnection GetSQLiteConnection()
        {
            SQLiteConnection conn=new SQLiteConnection(@"data source=E:\SQliteTest\SQliteTest\bin\Debug\JxyDb.db");
            conn.SetPassword("123456");//数据库密码
            return conn;
        }
        private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            cmd.Parameters.Clear();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = CommandType.Text;
            cmd.CommandTimeout = 30;
            if (p != null)
            {
                foreach (SQLiteParameter parm in p)
                {
                    cmd.Parameters.AddWithValue(parm.ParameterName, parm.Value);
                }
            }
        }
        public static DataSet ExecuteDataset(string cmdText, params object[] p)
        {
            DataSet ds = new DataSet();
            SQLiteCommand command = new SQLiteCommand();
            using (SQLiteConnection connection = GetSQLiteConnection())
            {
                PrepareCommand(command, connection, cmdText, p);
                SQLiteDataAdapter da = new SQLiteDataAdapter(command);
                da.Fill(ds);
            }
            return ds;
        }
        public static DataRow ExecuteDataRow(string cmdText, params object[] p)
        {
            DataSet ds = ExecuteDataset(cmdText, p);
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                return ds.Tables[0].Rows[0];
            return null;
        }
        /// <summary>
        /// 返回受影响的行数
        /// </summary>
        /// <param name="cmdText">a</param>
        /// <param name="commandParameters">传入的参数</param>
        /// <returns></returns>
        public static int ExecuteNonQuery(string cmdText, params object[] p)
        {
            SQLiteCommand command = new SQLiteCommand();
            using (SQLiteConnection connection = GetSQLiteConnection())
            {
                PrepareCommand(command, connection, cmdText, p);
                return command.ExecuteNonQuery();
            }
        }
        /// <summary>
        /// 返回SqlDataReader对象
        /// </summary>
        /// <param name="cmdText"></param>
        /// <param name="commandParameters">传入的参数</param>
        /// <returns></returns>
        public static SQLiteDataReader ExecuteReader(string cmdText, params object[] p)
        {
            SQLiteCommand command = new SQLiteCommand();
            SQLiteConnection connection = GetSQLiteConnection();
            try
            {
                PrepareCommand(command, connection, cmdText, p);
                SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
                return reader;
            }
            catch
            {
                connection.Close();
                throw;
            }
        }
        /// <summary>
        /// 返回结果集中的第一行第一列,忽略其他行或列
        /// </summary>
        /// <param name="cmdText"></param>
        /// <param name="commandParameters">传入的参数</param>
        /// <returns></returns>
        public static object ExecuteScalar(string cmdText, params object[] p)
        {
            SQLiteCommand cmd = new SQLiteCommand();
            using (SQLiteConnection connection = GetSQLiteConnection())
            {
                PrepareCommand(cmd, connection, cmdText, p);
                return cmd.ExecuteScalar();
            }
        }
        /// <summary>
        /// 分页
        /// </summary>
        /// <param name="recordCount"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="cmdText"></param>
        /// <param name="countText"></param>
        /// <param name="p"></param>
        /// <returns></returns>
        public static DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, params object[] p)
        {
            if (recordCount < 0)
                recordCount = int.Parse(ExecuteScalar(countText, p).ToString());
            DataSet ds = new DataSet();
            SQLiteCommand command = new SQLiteCommand();
            using (SQLiteConnection connection = GetSQLiteConnection())
            {
                PrepareCommand(command, connection, cmdText, p);
                SQLiteDataAdapter da = new SQLiteDataAdapter(command);
                da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");
            }
            return ds;
        }
 
        /**/
        /// <summary>
        /// 放回一个SQLiteParameter
        /// </summary>
        /// <param name="name">参数名字</param>
        /// <param name="type">参数类型</param>
        /// <param name="size">参数大小</param>
        /// <param name="value">参数值</param>
        /// <returns>SQLiteParameter的值</returns>
        public static  SQLiteParameter CreateSqliteParameter(string name, DbType type, int size, object value)
        {
            SQLiteParameter parm = new SQLiteParameter(name, type, size);
            parm.Value = value;
            return parm;
        }
 
    }
} 

Winform的测试界面和代码如下。

 

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.SQLite;
 
namespace SQliteTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string Sqlstr = "INSERT INTO [Users] VALUES(@username,@mobile)";
            SQLiteParameter[] canshu = new SQLiteParameter[]{
                        DAL.SQLiteHelper.CreateSqliteParameter("@username",DbType.String,50,this.textBox1.Text),
                        DAL.SQLiteHelper.CreateSqliteParameter("@mobile",DbType.String,50,this.textBox2.Text)
                      };
            DAL.SQLiteHelper.ExecuteNonQuery(Sqlstr, canshu);
            Bangding();
 
        }
 
        public void Bangding()
        {
            SQLiteParameter[] canshu1 = new SQLiteParameter[] { DAL.SQLiteHelper.CreateSqliteParameter("@id", DbType.Int32, 4, 1) };
            string Sqlstr = "select * from users";
            this.dataGridView1.DataSource = DAL.SQLiteHelper.ExecuteDataset(Sqlstr, canshu1).Tables[0];
            
        }
 
    }
}

 项目文件

 没有做性能测试,应该问题不大。 紧紧做入门,保存下来以便自己日后会用到。

 

 

C# 有没有自带数据库

C# 本身并不自带数据库‌,但C# 提供了与多种数据库交互的丰富API和工具,开发者可以使用这些工具与各种数据库系统如MySQL、SQL Server、Oracle等进行交互。

不过,在C#中可以使用一些内置的数据库选项,这些选项通常与应用程序一起打包和分发,适用于需要本地数据存储的场景。这些内置的数据库选项包括:

  1. ‌SQL Server Compact Edition (CE)‌:这是一个轻量级的数据库引擎,非常适合于桌面和移动应用程序。它提供了SQL Server的核心功能,但不需要复杂的安装和配置。
  2. ‌SQLite‌:SQLite是一个开源的嵌入式关系数据库,它不需要一个独立的服务器进程或操作系统支持。SQLite数据库是一个单一的文件,可以很容易地复制和分发。
  3. ‌LiteDB‌:LiteDB是一个用C#编写的开源NoSQL嵌入式数据库,它提供了类似于MongoDB的API,适用于需要快速开发和轻量级数据存储的场景。

这些内置的数据库选项可以在C#项目中轻松集成和使用,以满足应用程序的本地数据存储需求。

请注意,虽然这些数据库选项在C#项目中非常常见和实用,但它们并不是C#语言本身的一部分,而是作为第三方库或工具与C#一起使用。

C# 本身并不自带数据库,但它可以与多种数据库进行交互,包括但不限于 SQL Server, MySQL, SQLite, PostgreSQL 等。

如果你想要一个轻量级的数据库,可以使用 SQLite,它是一个嵌入式数据库,可以直接打包在应用程序中。

以下是一个使用 SQLite 的 C# 示例代码:

using System;
using System.Data.SQLite;
 
class Program
{
    static void Main()
    {
        string connectionString = "Data Source=example.db;Version=3;";
        using (var connection = new SQLiteConnection(connectionString))
        {
            connection.Open();
 
            using (var command = new SQLiteCommand(connection))
            {
                command.CommandText = "CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT)";
                command.ExecuteNonQuery();
            }
 
            using (var command = new SQLiteCommand(connection))
            {
                command.CommandText = "INSERT INTO people (name) VALUES ('John Doe')";
                command.ExecuteNonQuery();
            }
 
            using (var command = new SQLiteCommand(connection))
            {
                command.CommandText = "SELECT id, name FROM people";
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Console.WriteLine($"ID: {reader["id"]}, Name: {reader["name"]}");
                    }
                }
            }
        }
    }
}

这段代码演示了如何在 C# 中使用 SQLite 执行基本的数据库操作,包括创建表格、插入数据以及查询数据。在实际应用中,你需要确保已经安装了 SQLite,并且在项目中引用了 System.Data.SQLite 库。

C#中如何集成LiteDB

在C#中集成LiteDB的步骤如下:

  1. ‌安装LiteDB‌:

    • 通过NuGet包管理器来安装LiteDB。在Visual Studio中,右键点击你的项目,选择“管理 NuGet 程序包”,然后搜索“LiteDB”并点击“安装”。或者,你也可以使用 Package Manager Console 来安装,命令为 Install-Package LiteDB
  2. ‌定义数据模型‌:

    • 创建一个类来表示你的数据模型。这个类应该包含你需要存储的数据属性。例如,你可以定义一个 TranslItem 类来表示翻译项,其中包含 IdText 和 Trans 属性。
  3. ‌创建数据库和集合‌:

    • 使用 LiteDatabase 类来连接或创建数据库。LiteDB 会在你的应用程序路径下创建一个 .db 文件作为数据库。
    • 使用 GetCollection<T> 方法来获取或创建集合。这个集合用于存储你的数据模型实例。
  4. ‌执行CRUD操作‌:

    • 使用LiteDB提供的方法来处理增删查改(CRUD)操作。例如,使用 Insert 方法插入数据,使用 FindAll 或 Find 方法查询数据,使用 Update 方法更新数据,使用 Delete 方法删除数据。

以下是一个简单的示例代码,展示了如何在C#中使用LiteDB:

using LiteDB;

public class TranslItem
{
    [BsonId]
    public int Id { get; set; }
    public string? Text { get; set; }
    public string? Trans { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建或连接数据库
        using (var db = new LiteDatabase("transldata.db"))
        {
            // 获取或创建集合
            var transls = db.GetCollection<TranslItem>("transls");

            // 插入数据
            var tr = new TranslItem { Text = "Hello", Trans = "Hola" };
            transls.Insert(tr);

            // 查询数据
            var all = transls.FindAll();
            foreach (var item in all)
            {
                Console.WriteLine($"Id: {item.Id}, Text: {item.Text}, Trans: {item.Trans}");
            }

            // 更新数据
            var itemToUpdate = transls.FindOne(x => x.Text == "Hello");
            if (itemToUpdate != null)
            {
                itemToUpdate.Trans = "Bonjour";
                transls.Update(itemToUpdate);
            }

            // 删除数据
            transls.Delete(tr.Id);
        }
    }
}

在这个示例中,我们定义了一个 TranslItem 类来表示翻译项,然后连接到名为 "transldata.db" 的数据库,并获取或创建了一个名为 "transls" 的集合。接下来,我们演示了如何插入、查询、更新和删除数据。

请注意,这只是一个基本的示例,实际应用中你可能需要根据自己的需求进行更多的配置和优化。

 

标签:内嵌,SQLite,C#,数据库,System,command,using,new
From: https://www.cnblogs.com/tyxajh/p/18652149

相关文章

  • C语言的其他关键字
    数据类型enum枚举,为一个变量定义一组命名的整数常量,或者更简单点就是给一组变量(一般是相关的)起一个统一的名字,这一组变量在其中就会有一个对应的整数常量,从0开始依次递增,也可显式指定,之后的依次递增,可以用这个名字.变量名的格式进行使用,对应的整数值主要是为了内部表示和可能......
  • 学习-Niginx-执行yum install -y gcc时候报错“14: curl#6 - "Could not resolve host
    报错信息如下:[root@localhostnginx-1.21.6]#yuminstall-ygcc已加载插件:fastestmirrorLoadingmirrorspeedsfromcachedhostfileCouldnotretrievemirrorlisthttp://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stockerrorwas14:curl#6......
  • Emacs 中的缓冲区(Buffer)介绍
    Emacs中的缓冲区(Buffer)在Emacs中,缓冲区(buffer)是一个核心概念,表示Emacs内部用于处理和显示文本的“工作区域”。每个打开的文件、运行的命令、显示的消息、终端会话等都被分配到一个独立的缓冲区。缓冲区的特点不局限于文件:缓冲区不一定与文件相关联。它可以是用......
  • MyBatis 动态 SQL:<choose> 与 <if>`的优雅实践
    MyBatis动态SQL:<choose>与<if>的优雅实践在实际开发中,我们经常需要根据不同的条件动态生成SQL查询语句。MyBatis提供了强大的动态SQL功能,能够帮助我们轻松实现这一需求。本文将结合一个实际案例,详细讲解如何使用MyBatis的<choose>和<if>标签来实现多条件查询,并分......
  • 2025最新超详细Pycharm安装配置完整教程!
    包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】PyCharm的使用非常直观和便捷。它提供了代码编辑、运行、调试等功能,让你的Python编程更加高效。**你可以通过创建新的项目来管理你的代码。**在项目中,你可以创建Python文件,并编写你的代码。PyCharm会自动识别你......
  • LeetCode算法题 (二叉树的直径)Day11!!!C/C++
    https://leetcode.cn/problems/diameter-of-binary-tree/description/一、题目描述给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它......
  • 银河麒麟Linux同步时间:NTPd、Chrony、systemd-timesyncd 配置与使用
    1.时间同步协议服务对比在网络中,常用的时间同步协议服务主要有以下几种:特性NTPdsystemd-timesyncdChrony协议NTPSNTPNTP说明NTPd(NetworkTimeProtocoldaemon)是最经典的时间同步服务,使用NTP协议来同步系统时间。它支持复杂的配置,能够处理多个时间源,并且具有......
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
    某大型制造企业的生产车间同时采用了西门子S7-1500PLC作为核心控制系统的一部分,负责主要生产流程的控制与数据处理;而在特定生产环节,由于历史设备遗留或工艺配套需求,存在使用ABPLC的情况。这就导致了在整个自动化生产系统中,出现了两种不同的工业以太网协议(Profinet和Eth......
  • c语言文件操作
    1.为什么使用文件(将数据记录保存)我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受......
  • 《解锁PyTorch潜能:探索强大的辅助库》
    《解锁PyTorch潜能:探索强大的辅助库》一、PyTorch入门二、视觉利器torchvision(一)数据集与加载器(二)图像变换魔法(三)预训练模型的力量三、文本处理好帮手torchtext(一)文本数据集加载(二)文本预处理工具(三)词嵌入支持四、音频处理专家torchaudio(一)音频......