最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#項目中添加本地數據庫SQLite的干貨教程

 更新時間:2026年07月09日 10:11:39   作者:HQL_seven  
SQLite是一個輕量級的嵌入式數據庫,它的庫文件非常小巧,不需要獨立的服務器進程或配置,這使得它非常適合在資源受限的環(huán)境中使用,這篇文章主要介紹了C#項目中添加本地數據庫SQLite的相關資料,需要的朋友可以參考下

我們在日常開發(fā)工作中,不可避免地使用到數據庫,這篇文章將介紹一個C# 輕量 ORM 庫——SQLite.主要的概念介紹這里就不多說了,文章以干貨為主。

1. 開發(fā)工具

Microsoft Visual Studio Community 2022 (64 位) - Current

版本 17.14.21 (November 2025)

2. 安裝對應的 NuGet 包

1)在 Visual Studio 中:右鍵項目 → 管理 NuGet 包;

2)搜索并安裝:sqlite-net-pcl.

3. 建立文件夾

建議是新建文件夾,將有關數據庫的內容保存在一起,這樣便于管理,以下是我的文件結構,可以用于參考。

其中:DatabaseManager.cs存放的是數據庫的管理操作;UserRepository.cs存放的是對User數據表的管理操作;User.cs存放的是User數據表的結構。

4. 建立數據表

建立數據表的結構,也就是Model.以下是我的User.cs文件的內容,可以作為參考。

using SQLite;

namespace My.DatabaseModel
{
    /// <summary>
    /// 用戶表
    /// </summary>
    [Table("User")]
    public class User
    {
        [PrimaryKey, AutoIncrement]
        [Column("id")]
        public int Id { get; set; }

        [Column("userId")]
        public string DoctorId { get; set; }

        [Column("avatar")]
        public string Avatar { get; set; }

        [Column("name")]
        public string Name { get; set; }
    }
}

1)其中 [PrimaryKey, AutoIncrement]表示id是該表的主鍵,數值自增。

2)userId建議保持唯一性,可以根據id變化,以下是參考,根據id修改后一定要記得更新。

 // 1? 插入 User
 Db.Insert(user);

 // 2? 生成 PatientId
 user.UserId= "U" + (10000 + user.Id);

 // 3? 更新 User
 Db.Update(user);

5. 建立數據庫

數據庫的操作基本上是初始化和銷毀兩個操作而已。

using My.DatabaseModel;
using SQLite;

namespace My.Database
{
    public class DatabaseManager
    {
        private static SQLiteConnection db;

        private static string dbPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "myDatabase.db");
        public static SQLiteConnection DB
        {
            get
            {
                if (db == null)
                {
                    Init();
                }
                return db;
            }
        }

        public static void Init()
        {
            // 1 判斷數據庫是否存在
            bool dbExists = File.Exists(dbPath);

            // 2 創(chuàng)建連接
            db = new SQLiteConnection(dbPath);

            if (!dbExists)
            {
                Console.WriteLine("數據庫不存在,創(chuàng)建數據庫...");
                // 自動創(chuàng)建表
                // 用戶表
                db.CreateTable<User>();
            }
            Console.WriteLine("數據庫初始化完成");
        }

        /// <summary>
        /// 銷毀數據庫
        /// </summary>
        public static void DestroyDatabase()
        {
            try
            {
                //1 關閉數據庫連接
                if (db != null)
                {
                    db.Close();
                    db.Dispose();
                    db = null;
                }

                //2 刪除數據庫文件
                if (File.Exists(dbPath))
                {
                    File.Delete(dbPath);
                    Console.WriteLine("數據庫已銷毀");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("刪除數據庫失敗: " + ex.Message);
            }
        }

        /// <summary>
        /// 重置數據庫
        /// </summary>
        public static void ResetDatabase()
        {
            DestroyDatabase();
            Init();
        }
    }
}

這里注意,銷毀數據庫時一定要先關閉數據庫連接,再刪除數據庫文件。
private static string dbPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "myDatabase.db");就是創(chuàng)建數據庫文件,文件名為“myDatabase.db”.文件名可以自定義的,建議根據自己的需求更換具有標識性的文件名,建議以Database結尾。

6. 增加對數據表的操作

我將對數據表的操作以表為單位建立了文件——UserRepository.cs.以下是我的文件內容,可以作為參考。

using My.DatabaseModel;
using SQLite;

namespace RTLAB_MMDS.Database
{
    public class UserRepository
    {
        private static  SQLiteConnection Db => DatabaseManager.DB;

        /// <summary>
        /// 插入數據
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public User InsertUser(User user)
        {
            Db.Insert(user);
            return user;
        }

        /// <summary>
        /// 獲取全部數據
        /// </summary>
        /// <returns></returns>
        public List<User> GetAllUsers()
        {
            return Db.Table<User>().ToList();
        }

        /// <summary>
        /// 根據用戶id獲取數據
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public User GetUserByUserId(string userId)
        {
            return Db.Table<User>()
                .FirstOrDefault(d => d.UserId== userId);
        }
        
		 /// <summary>
		 /// 根據用戶id刪除患者
		 /// <param name="userId"></param>
		 /// </summary>
		 public void Delete(string userId)
		 {	     
		     Db.Table<User>()
		         .Delete(d => d.UserId== userId);
		 }
		 
        /// <summary>
        /// 更新用戶
        /// </summary>
        public User Update(User user)
        {
            Db.Update(user);
            return user;
        }
    }
}

這種不涉及外鍵連接和多表組合的數據庫操作是比較簡單的,這里寫的也不是很全,但是基本邏輯是這樣的,相對復雜的等會放后面單獨講。
還有一個點要注意的是我基本上每一個都寫了return,實際根據項目情況寫就好,我這里是為了下面的操作示例寫的而已。

7. 數據表的操作示例

下面就給一個簡單的用戶表增刪改的操作示例。

private void example()
{
   //初始化數據庫
   DatabaseManager.Init();
   
   UserRepository repo = new UserRepository();
   
   //創(chuàng)建用戶
   User user1= new User
   {
       UserId = "123",
       Avatar = "",
       Name = "張三",
   };

   //插入
   user1 = repo.InsertUser(user1);
   Console.WriteLine("創(chuàng)建用戶成功:" + user1.Name);
   
   // 查找
   User user2 = repo.GetUserByUserId(user1.UserId);	
   Console.WriteLine("查找用戶成功:" + user2.Name);
   
	 // 修改
   user2.Name = "李四";
   User user3 = repo.Update(user2); 
   Console.WriteLine("修改用戶成功:" + user3.Name);
   
   // 刪除
   repo.Delete(user3);
   Console.WriteLine("刪除用戶成功");
   
}

一定要初始化數據庫,否則一切操作白搭,建議在Program.cs文件中就初始化。

好了,以上的基本內容就講完了。每次總結的時候都覺得當初摸索的自己像個傻子,囧。

下面說一下組合表的事情吧。

數據庫通常不會只有像上面User這樣簡單的表,一般可能還得存點別的結構,而在C#中又不給直接存什么List<string>;,還有數據比較大的情況下都存一張表檢索又影響效率,所以,下面說一下組合的情況。

也是直接通過例子來講解。

8. 組合表的結構

using SQLite;

namespace My.DatabaseModel
{
    /// <summary>
    /// 患者表
    /// </summary>
    [Table("User")]
    public class User
    {
        [PrimaryKey, AutoIncrement]
        [Column("id")]
        public int Id { get; set; }

        [Column("userId")]
        public string DoctorId { get; set; }

        [Column("avatar")]
        public string Avatar { get; set; }

        [Column("name")]
        public string Name { get; set; }

        [Ignore] // SQLite-Net 屬性,告訴它不要映射到表
        public List<Other> Others{ get; set; } = new List<Other>();

    }

    /// <summary>
    /// 其他
    /// </summary>
    [Table("Other")]
    public class Other
    {
        [PrimaryKey, AutoIncrement]
        [Column("id")]
        public int Id { get; set; }

        [Column("userId")]
        public string UserId { get; set; }

        [Column("otherName")]
        public string OtherName { get; set; }
    }

}

1)Other也需要在初始化數據庫時創(chuàng)建表,即在DatabaseManager.cs中添加db.CreateTable<Other>();

2)Other.UserId=User.userId,當然字段名是可以自定義的,不過建議相同,這樣可讀性比較高。

3)List<Other> Others;我這里存的是List,也可以存一條public Other OtherSingle{ get; set; } = new Other();如果存的OtherSingle,記得修改以下對組合表的操作。

9. 對組合表的操作

直接上代碼吧,直觀很重要?。?!

using My.DatabaseModel;
using SQLite;

namespace RTLAB_MMDS.Database
{
    public class UserRepository
    {
        private static  SQLiteConnection Db => DatabaseManager.DB;

        /// <summary>
        /// 插入數據
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public User InsertUser(User user)
        {
            // RunInTransaction是保證數據庫操作的原子性
            // 通俗解釋就是RunInTransaction里面的代碼只有兩個結果,全部失敗和全部成功
            Db.RunInTransaction(() =>
            { 
              // 插入user
            	Db.Insert(user);
            	string userId = user.UserId;
            	if(user.others != null)
            	{
            	 foreach(var other in user.Others)
            	 {
            	  other.UserId = userId;
            	  // 插入other
            	  Db.Insert(other);
            	 }
            	}
            });
            return user;
        }

        /// <summary>
        /// 獲取全部數據
        /// </summary>
        /// <returns></returns>
        public List<User> GetAllUsers()
        {
            var users = Db.Table<User>().ToList();
            
            // 把 Other 表按 UserId 分組,生成一個可以快速查找的內存索引
            var otherLookup = Db.Table<Other>()
                 .ToList()
                 .ToLookup(p => p.UserId);
            
            foreach(var user in users)
            {
              // 這里就可以根據user.userId直接索引到全部數據啦
              user.Others = otherLookup[user.userId].ToList();
            } 
                 
            return users;
        }

        /// <summary>
        /// 根據用戶id獲取數據
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public User GetUserByUserId(string userId)
        {
            var user = Db.Table<User>()
                .FirstOrDefault(d => d.UserId== userId);
                
            if (user == null)
                return null;

             user.Others= Db.Table<Other>()
					     .Where(p => p.UserId == userId)
					     .ToList();
					     
            return user;
        }
        
		 /// <summary>
		 /// 根據用戶id刪除患者
		 /// <param name="userId"></param>
		 /// </summary>
		 public void Delete(string userId)
		 {	     
		     // 先刪除子表里的數據
          Db.Table<Other>()
               .Delete(a => a.UserId == userId);		     

         // 再刪除主表里的數據
		     Db.Table<User>()
		         .Delete(d => d.UserId== userId);
		 }
		 
        /// <summary>
        /// 更新用戶
        /// </summary>
        public User Update(User user)
        {
            Db.Update(user);
            
            string userId = user.UserId;
            
            // 刪除舊Other
            Db.Table<Other>()
                .Delete(p => p.userId == userId);
                
            // 插入新Other
            if (user.Others != null)
            {
                foreach (var other in user.Others)
                {
                    other.UserId = userId;
                    Db.Insert(other);
                }
            }
            
            return user;
        }
    }
}

10. 插入組合表

這里就簡單給一個插入的示例吧,其他操作都是相通的。

private void example()
{
   //初始化數據庫
   DatabaseManager.Init();
   
   UserRepository repo = new UserRepository();
   
   //創(chuàng)建用戶
   User user= new User
   {
       UserId = "123",
       Avatar = "",
       Name = "張三",
   };

   List<Other> others = new List<Other>();
   
   for(int i =0; i++; i<10)
   {
       Other other = new Other();
       other.OtherName = $"OtherName_{i}";
       others.Add(other);
   }
   user.Other = others;
  
   //插入
   user= repo.InsertUser(user);
   Console.WriteLine("創(chuàng)建用戶成功:" + user.Name);
      
}

11. 結語

總結就是,啥也不會的時候開頭最難,等回顧的時候發(fā)現(xiàn)好像也就那樣。數據庫從無到有大致就是這樣了。數據量大的情況下,比如存了繪圖數據,有N個點的那種,也可以考慮文件存儲方式,List<string>也可以考慮json存儲,這就下次遇到再說吧。感謝你看完全文!比心!

到此這篇關于C#項目中添加本地數據庫SQLite的文章就介紹到這了,更多相關C#添加本地數據庫SQLite內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C# 表達式樹Expression Trees的知識梳理

    C# 表達式樹Expression Trees的知識梳理

    本篇文章主要介紹了表達式樹 Expression Trees的基礎知識:Lambda 表達式創(chuàng)建表達式樹;API 創(chuàng)建表達式樹;編譯表達式樹;執(zhí)行表達式樹;修改表達式樹等等,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • C#接入OpenClaw的完整指南

    C#接入OpenClaw的完整指南

    OpenClaw通常指一種機器人控制庫或?API,本文介紹了如何使用C#與OpenClaw進行交互,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-04-04
  • C#中的lock、Monitor、Mutex學習筆記

    C#中的lock、Monitor、Mutex學習筆記

    這篇文章主要介紹了C#中的lock、Monitor、Mutex學習筆記,本文講解的都是線程同步的一些知識,需要的朋友可以參考下
    2015-01-01
  • C#中的不可變數據類型介紹(不可變對象、不可變集合)

    C#中的不可變數據類型介紹(不可變對象、不可變集合)

    這篇文章主要介紹了C#中的不可變數據類型介紹(不可變對象、不可變集合),本文講解了不可變對象、自定義不可變集合、Net提供的不可變集合、不可變優(yōu)點、不可變對象缺點等內容,需要的朋友可以參考下
    2015-04-04
  • C#匿名函數和匿名方法的使用

    C#匿名函數和匿名方法的使用

    本文主要介紹了C#匿名函數和匿名方法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • C#中緩存的基本使用方法

    C#中緩存的基本使用方法

    項目開發(fā)過程中緩存的應用到處可見,下面這篇文章主要給大家介紹了關于C#中緩存的基本使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • c#解壓文件的實例方法

    c#解壓文件的實例方法

    該方法適應應用桌面快捷鍵壓縮的文件,zip,rar格式的文件進行解壓!
    2013-05-05
  • C# Color.FromArgb()及系統(tǒng)顏色對照表一覽

    C# Color.FromArgb()及系統(tǒng)顏色對照表一覽

    這篇文章主要介紹了C# Color.FromArgb()及系統(tǒng)顏色對照表一覽,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Unity實現(xiàn)圖形相交檢測

    Unity實現(xiàn)圖形相交檢測

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)圖形相交檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#利用插值字符串處理器寫一個sscanf

    C#利用插值字符串處理器寫一個sscanf

    這篇文章主要為大家詳細介紹了C#如何利用插值字符串處理器寫一個sscanf,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-02-02

最新評論

太仓市| 荔浦县| 梁山县| 郁南县| 顺平县| 闵行区| 永仁县| 池州市| 桓仁| 肥西县| 喀什市| 和静县| 旬阳县| 通化县| 乾安县| 政和县| 黑龙江省| 靖远县| 临泉县| 盐山县| 涡阳县| 马公市| 綦江县| 建平县| 景泰县| 峨眉山市| 宁明县| 五原县| 柞水县| 营口市| 贵州省| 外汇| 平舆县| 高邮市| 安乡县| 兰州市| 永济市| 兴宁市| 杭锦旗| 泰兴市| 龙南县|