欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#調(diào)用SQLite的詳細(xì)代碼舉例

 更新時間:2024年07月24日 10:28:22   作者:GuiDaniel  
SQLite是一個輕量級、跨平臺的關(guān)系型數(shù)據(jù)庫,在小型項目中,方便,易用,同時支持多種開發(fā)語言,這篇文章主要給大家介紹了關(guān)于C#調(diào)用SQLite的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、什么是SQLite

SQLite 是一個輕量級的數(shù)據(jù)庫管理系統(tǒng),它不需要一個獨立的服務(wù)器進(jìn)程或操作系統(tǒng)的運行,而是將整個數(shù)據(jù)庫,包括定義、表、索引以及數(shù)據(jù)本身,全部存儲在一個獨立的磁盤文件中。SQLite 被設(shè)計為簡單易用,它支持 SQL 語言的大部分功能,并且是跨平臺的,可以在多種操作系統(tǒng)和硬件平臺上運行,包括桌面、服務(wù)器、移動設(shè)備等。

SQLite 的主要特點包括:

  • 輕量級:SQLite 的源代碼體積小,編譯后的庫文件也非常小巧,便于集成到各種應(yīng)用程序中。

  • 無需配置:與需要復(fù)雜配置和安裝過程的數(shù)據(jù)庫系統(tǒng)不同,SQLite 不需要任何配置就可以直接使用。

  • 跨平臺:SQLite 可以在多種操作系統(tǒng)上運行,包括 Windows、macOS、Linux、Android 和 iOS 等。

  • 自包含:SQLite 是一個自包含的庫,應(yīng)用程序可以通過簡單的 API 調(diào)用直接與數(shù)據(jù)庫交互。

  • 事務(wù)性:SQLite 支持事務(wù),這意味著你可以確保數(shù)據(jù)的完整性,即使在發(fā)生錯誤或系統(tǒng)崩潰的情況下。

  • 并發(fā)控制:SQLite 提供了一定程度的并發(fā)控制,允許多個進(jìn)程或線程同時訪問數(shù)據(jù)庫。

  • 開源:SQLite 是一個開源項目,遵循寬松的公共領(lǐng)域許可證,可以免費使用,甚至可以在商業(yè)產(chǎn)品中使用。

二、C#調(diào)用SQLite

C#調(diào)用SQLite只需要使用System.Data.SQLite這個庫即可,無需安裝SQL,調(diào)用這個庫即可在本地進(jìn)行數(shù)據(jù)處理,輕量方便。

你可以通過NuGet包管理器來安裝System.Data.SQLite庫。在Visual Studio中,你可以通過“工具”->“NuGet包管理器”->“包管理器控制臺”來安裝。

三、編寫SQLite的Helper類

SQLite本身是SQL的語言進(jìn)行編寫的,如果你會使用SQL,那么調(diào)用對你而言沒有什么難度;如果你不太會SQL,那么可以使用筆者的Helper類幫助你快速使用SQLite。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Linq;
using System.IO;


namespace SqliteTest
{
    public class SQLiteHelper
    {
        /*******條件語法*******/
        //1.簡單的刪除條件:Age > 40
        //2.使用邏輯運算符:Age > 40 And Country = 'USA'
        //3.使用IN運算符:IN運算符用于指定列的值必須屬于一個特定的值列表:Category IN ('Electronics', 'Books', 'Toys')
        //4.使用LIKE運算符:LIKE運算符用于在列的值中搜索特定的模式(通常用于字符串) Username LIKE 'j%';
        //5.使用BETWEEN運算符:OrderDate BETWEEN '2023-01-01' AND '2023-03-31'
        //6.使用IS NULL 或 IS NOT NULL:Manager IS NULL


        // 用于與SQLite數(shù)據(jù)庫交互的連接對象
        private SQLiteConnection connection;
        // 操作的表名
        private string tableName;
        // 表的列名,以逗號分隔的字符串
        private string columnNameStr;
        //表的列名
        private string[] columnNames;

        /// <summary>
        /// 通過指定的數(shù)據(jù)庫文件路徑初始化SQLiteHelper類的實例。
        /// </summary>
        /// <param name="dbAddress">數(shù)據(jù)庫文件的路徑。</param>
        public SQLiteHelper(string dbAddress)
        {
            // 創(chuàng)建SQLite連接字符串構(gòu)建器,并設(shè)置數(shù)據(jù)源和版本
            var connectionStringBuilder = new SQLiteConnectionStringBuilder
            {
                DataSource = dbAddress,
                Version = 3
            };

            // 通過連接字符串構(gòu)建器創(chuàng)建SQLite連接對象
            connection = new SQLiteConnection(connectionStringBuilder.ConnectionString);
            // 打開數(shù)據(jù)庫連接
            connection.Open();
        }

        /// <summary>
        /// 關(guān)閉數(shù)據(jù)庫連接。
        /// </summary>
        public void Close()
        {
            // 如果連接不為空且狀態(tài)為打開,則關(guān)閉連接
            if (connection != null && connection.State == ConnectionState.Open)
            {
                connection.Close();
            }
        }

        /// <summary>
        /// 創(chuàng)建表,包括指定的列和類型。
        /// </summary>
        /// <param name="tableName">要創(chuàng)建的表名。</param>
        /// <param name="hasAutoIncrementId">是否自動添加自增ID。</param>
        /// <param name="columns">列名數(shù)組。</param>
        /// <param name="columnTypes">列類型數(shù)組。</param>
        public void CreateTable(string tableName, bool hasAutoIncrementId, string[] columns, Type[] columnTypes)
        {
            // 設(shè)置當(dāng)前操作的表名
            this.tableName = tableName;
            // 設(shè)置列名字符串
            columnNameStr = string.Join(",", columns);
            columnNames = columns;  

            // 創(chuàng)建列定義列表
            var columnDefinitions = new List<string>();
            // 如果需要自動添加ID列
            if (hasAutoIncrementId)
            {
                columnDefinitions.Add("ID INTEGER PRIMARY KEY AUTOINCREMENT");
            }
            // 遍歷列類型數(shù)組,添加列定義
            for (int i = 0; i < columns.Length; i++)
            {
                var columnName = columns[i];
                var columnTypeStr = GetColumnType(columnTypes[i]);
                columnDefinitions.Add($"{columnName} {columnTypeStr}");
            }

            // 構(gòu)建列定義字符串
            string columnDefinitionsStr = string.Join(", ", columnDefinitions);
            // 構(gòu)建創(chuàng)建表的SQL語句
            string sqlStr = $"CREATE TABLE IF NOT EXISTS {tableName} ({columnDefinitionsStr});";
            // 執(zhí)行非查詢SQL命令創(chuàng)建表
            ExecuteNonQuery(sqlStr);
        }

        /// <summary>
        /// 刪除當(dāng)前的表
        /// </summary>
        public void DeleteTable()
        {
            string sql = $"DROP TABLE IF EXISTS {tableName};";
            ExecuteNonQuery(sql);
        }

        /// <summary>
        /// 創(chuàng)建索引以提高查詢效率,在創(chuàng)建表之后使用
        /// </summary>
        /// <param name="columnName">要創(chuàng)建索引的列名。</param>
        public void CreateIndex(string columnName)
        {
            string sql = $"CREATE INDEX IF NOT EXISTS {columnName} ON {tableName} ({columnName});";
            ExecuteNonQuery(sql);
        }

        /// <summary>
        /// 銷毀指定的索引。
        /// </summary>
        /// <param name="indexName">要刪除的索引的名稱。</param>
        public void DeleteIndex(string columnName)
        {
            string sql = $"DROP INDEX IF EXISTS {columnName};";
            ExecuteNonQuery(sql);
        }

        /// <summary>
        /// 獲取C#類型對應(yīng)的SQLite類型字符串。
        /// </summary>
        /// <param name="type">C#中的類型。</param>
        /// <returns>對應(yīng)的SQLite類型字符串。</returns>
        private string GetColumnType(Type type)
        {
            // 根據(jù)C#類型返回對應(yīng)的SQLite類型字符串
            switch (Type.GetTypeCode(type))
            {
                case TypeCode.Int32:
                case TypeCode.UInt32:
                case TypeCode.Int64:
                case TypeCode.UInt64:
                    return "INTEGER";
                case TypeCode.Double:
                    return "REAL";
                case TypeCode.Single:
                    return "FLOAT";
                case TypeCode.DateTime:
                    return "DATETIME";
                case TypeCode.Boolean:
                    return "BOOLEAN";

                default:
                    return "TEXT";
            }
        }

        /// <summary>
        /// 向表中插入記錄。
        /// </summary>
        /// <param name="values">要插入的值的數(shù)組。</param>
        /// <returns>插入操作影響的行數(shù)。</returns>
        public int Insert(params object[] values)
        {
            // 創(chuàng)建參數(shù)列表并初始化
            var parameters = values.Select((value, index) => new SQLiteParameter($"@{index}", value)).ToArray();
            // 構(gòu)建參數(shù)化SQL語句
            var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
            // 構(gòu)建插入數(shù)據(jù)的SQL語句
            string sql = $"INSERT INTO {tableName} ({columnNameStr}) VALUES ({parameterNames});";
            // 執(zhí)行非查詢SQL命令并返回影響的行數(shù)
            return ExecuteNonQuery(sql, parameters);
        }

        /// <summary>
        /// 獲取多條件的字符串組合
        /// </summary>
        /// <param name="bAnd">True為And邏輯,F(xiàn)alse 為 OR 邏輯</param>
        /// <param name="condition1"></param>
        /// <param name="condition2"></param>
        /// <param name="conditions"></param>
        /// <returns></returns>
        public string GetMultiContidion(bool bAnd, string condition1, string condition2, params string[] conditions)
        {
            if (bAnd)
            {
                if (conditions != null && conditions.Length > 0)
                {
                    string str1 = string.Join(" And ", conditions);
                    return string.Join(" And ", condition1, condition2, str1);
                }
                else
                {
                    return string.Join(" And ", condition1, condition2);
                }


            }
            else
            {
                if (conditions != null && conditions.Length > 0)
                {
                    string str1 = string.Join(" OR ", conditions);
                    return string.Join(" OR ", condition1, condition2, str1);
                }
                else
                {
                    return string.Join(" OR ", condition1, condition2);
                }
            }
        }

        /// <summary>
        /// 根據(jù)條件刪除記錄。
        /// </summary>
        /// <param name="condition">刪除條件。</param>
        /// <returns>刪除操作影響的行數(shù)。</returns>
        public int Delete(string condition)
        {

            // 構(gòu)建刪除數(shù)據(jù)的SQL語句
            string sql = $"DELETE FROM {tableName} WHERE {condition};";

            // 執(zhí)行非查詢SQL命令并返回影響的行數(shù)
            return ExecuteNonQuery(sql);
        }

        /// <summary>
        /// 更新表中的記錄。
        /// </summary>
        /// <param name="columnName">要更新的列名。</param>
        /// <param name="value">新的值。</param>
        /// <param name="condition">更新條件。</param>
        /// <returns>更新操作影響的行數(shù)。</returns>
        public int Update(string columnName, object value, string condition)
        {
            // 構(gòu)建更新數(shù)據(jù)的SQL語句
            string query = $"UPDATE {tableName} SET {columnName} = @{value} WHERE {condition};";
            // 創(chuàng)建參數(shù)對象并添加到SQL命令中
            var parameter = new SQLiteParameter(value.ToString(), value);
            // 執(zhí)行非查詢SQL命令并返回影響的行數(shù)
            return ExecuteNonQuery(query, parameter);
        }

        /// <summary>
        /// 根據(jù)條件查詢列的值。
        /// </summary>
        /// <param name="columnName">要查詢的列名。</param>
        /// <param name="condition">查詢條件。</param>
        /// <returns>查詢結(jié)果的值。</returns>
        public object GetValue(string columnName, string condition)
        {

            // 構(gòu)建查詢數(shù)據(jù)的SQL語句
            string selectQuery = $"SELECT {columnName} FROM {tableName} WHERE {condition};";
            // 執(zhí)行查詢SQL命令并返回查詢結(jié)果
            return ExecuteScalar(selectQuery);
        }

        /// <summary>
        /// 根據(jù)條件查詢列的值。
        /// </summary>
        /// <param name="columnName">要查詢的列名。</param>
        /// <param name="condition">查詢條件。</param>
        /// <returns>查詢結(jié)果的值。</returns>
        public List<object> GetValues(string columnName, string condition)
        {
            List<object> values = new List<object>();

            string selectQuery = "";

            if (string.IsNullOrWhiteSpace(condition))
            {
                selectQuery = $"SELECT {columnName} FROM {tableName};";
            }
            else
            {
                selectQuery = $"SELECT {columnName} FROM {tableName} WHERE {condition};";
            }

            try
            {
                using (var reader = ExecuteQuery(selectQuery))
                {
                    while (reader.Read())
                    {
                        values.Add(reader[columnName]);
                    }
                }
            }
            catch (Exception ex)
            {
                LogException(ex);
            }


            return values;
        }

        /// <summary>
        /// 根據(jù)條件獲取所有行的數(shù)據(jù)
        /// </summary>
        /// <param name="condition"></param>
        /// <returns></returns>
        public List<Dictionary<string, object>> GetRowDatas(string condition)
        {
            List<Dictionary<string, object>> values = new List<Dictionary<string, object>>();

            string selectQuery = "";

            if (string.IsNullOrWhiteSpace(condition))
            {
                selectQuery = $"SELECT {columnNameStr} FROM {tableName};";
            }
            else
            {
                selectQuery = $"SELECT {columnNameStr} FROM {tableName} WHERE {condition};";
            }

            try
            {
                using (var reader = ExecuteQuery(selectQuery))
                {
                    while (reader.Read())
                    {
                        Dictionary<string,object > dict = new Dictionary<string,object>();
                        foreach (var columnName in columnNames)
                        {
                            dict.Add(columnName, reader[columnName]);
                        }
                        values.Add(dict);
                    }
                }
            }
            catch (Exception ex)
            {
                LogException(ex);
            }


            return values;
        }

       

        /// <summary>
        /// 執(zhí)行非查詢SQL命令(如INSERT, UPDATE, DELETE)。
        /// </summary>
        /// <param name="sql">SQL命令字符串。</param>
        /// <param name="parameters">SQL命令參數(shù)數(shù)組。</param>
        /// <returns>命令執(zhí)行影響的行數(shù)。</returns>
        public int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)
        {
            try
            {
                // 使用SQLiteCommand對象執(zhí)行SQL命令
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = sql;
                    if (parameters != null)
                    {
                        command.Parameters.AddRange(parameters);
                    }
                    return command.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                // 記錄異常信息到日志文件
                LogException(ex);
                return 0;
            }
        }

        /// <summary>
        /// 執(zhí)行查詢SQL命令(如SELECT),返回SQLiteDataReader對象。
        /// </summary>
        /// <param name="sql">SQL命令字符串。</param>
        /// <returns>SQLiteDataReader對象。</returns>
        private SQLiteDataReader ExecuteQuery(string sql)
        {
            try
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = sql;
                    return command.ExecuteReader();
                }
            }
            catch (Exception ex)
            {
                LogException(ex);
                return null;
            }
        }

        /// <summary>
        /// 執(zhí)行查詢SQL命令(如SELECT),返回單個結(jié)果。
        /// </summary>
        /// <param name="sql">SQL命令字符串。</param>
        /// <returns>查詢結(jié)果的單個值。</returns>
        private object ExecuteScalar(string sql)
        {
            try
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = sql;
                    return command.ExecuteScalar();
                }
            }
            catch (Exception ex)
            {
                LogException(ex);
                return null;
            }
        }

        /// <summary>
        /// 記錄異常信息到日志文件。
        /// </summary>
        /// <param name="ex">要記錄的異常對象。</param>
        private void LogException(Exception ex)
        {
            // 將異常信息追加到日志文件中
            string errorMessage = $"發(fā)生錯誤:{ex.Message}{Environment.NewLine}{ex.StackTrace}";
            File.AppendAllText("error.log", errorMessage);
        }
    }
}

四、如何使用SQLiteHelper類

直接給出測試代碼,根據(jù)根據(jù)測試代碼了解封裝的用法

在這個例子中,首先創(chuàng)建了一個SQLiteHelper實例,并指定了數(shù)據(jù)庫文件的路徑。然后,使用CreateTable方法創(chuàng)建了一個名為Articles的表,用于存儲文章的標(biāo)題、內(nèi)容、作者和創(chuàng)建日期。

接下來,通過Insert方法向表中插入了一條文章記錄。然后,使用GetRowDatas方法查詢了包含特定關(guān)鍵詞的文章,并打印了查詢結(jié)果。

之后,通過Update方法更新了文章的標(biāo)題。注意,這里的更新條件是ID = 1,這意味著只有ID為1的文章會被更新。

接著,通過Delete方法刪除了ID為1的文章記錄。

還展示了如何創(chuàng)建和刪除索引來提高查詢效率。在這個例子中,首先為Title列創(chuàng)建了一個索引,然后又刪除了它。

最后,調(diào)用Close方法關(guān)閉了數(shù)據(jù)庫連接。

using System;

class Program
{
    static void Main()
    {
        // 數(shù)據(jù)庫文件路徑
        string dbPath = "blog.db";

        // 創(chuàng)建SQLiteHelper實例
        SQLiteHelper dbHelper = new SQLiteHelper(dbPath);

        // 1. 創(chuàng)建文章表
        dbHelper.CreateTable("Articles",
            hasAutoIncrementId: true,
            columns: new string[] { "Title", "Content", "Author", "CreateDate" },
            columnTypes: new Type[] { typeof(string), typeof(string), typeof(string), typeof(DateTime) });

        // 2. 插入文章
        object[] article1 = new object[] { "我的旅行日記", "這是一篇關(guān)于旅行的日記。", "小明", DateTime.Now };
        int rowsAffected = dbHelper.Insert(article1);
        Console.WriteLine($"插入文章記錄,影響行數(shù):{rowsAffected}");

        // 3. 查詢文章
        string condition = "Title LIKE '%旅行%'";
        List<object> articles = dbHelper.GetRowDatas(condition);
        Console.WriteLine("查詢包含'旅行'的文章:");
        foreach (var article in articles)
        {
            Console.WriteLine($"標(biāo)題: {article["Title"]}, 作者: {article["Author"]}, 創(chuàng)建日期: {article["CreateDate"]}");
        }

        // 4. 更新文章
        object[] article2 = new object[] { "更新的旅行日記", "這是一篇更新后的關(guān)于旅行的日記。" };
        int updateRowsAffected = dbHelper.Update("Title", article2[0], "ID = 1");
        Console.WriteLine($"更新文章記錄,影響行數(shù):{updateRowsAffected}");

        // 5. 刪除文章
        int deleteRowsAffected = dbHelper.Delete("ID = 1");
        Console.WriteLine($"刪除文章記錄,影響行數(shù):{deleteRowsAffected}");

        // 6. 創(chuàng)建索引以提高查詢效率
        dbHelper.CreateIndex("Title");

        // 7. 刪除不再需要的索引
        dbHelper.DeleteIndex("Title");

        // 8. 關(guān)閉數(shù)據(jù)庫連接
        dbHelper.Close();
    }
}

五、DB文件查看器

使用SQLiteSpy這個文件即可查看數(shù)據(jù)庫文件,方便排查問題

總結(jié) 

到此這篇關(guān)于C#調(diào)用SQLite的文章就介紹到這了,更多相關(guān)C#調(diào)用SQLite內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#.net編程創(chuàng)建Access文件和Excel文件的方法詳解

    C#.net編程創(chuàng)建Access文件和Excel文件的方法詳解

    這篇文章主要介紹了C#.net編程創(chuàng)建Access文件和Excel文件的方法,結(jié)合實例形式總結(jié)分析了C#創(chuàng)建Access與Excel文件的幾種常用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • C# 二進(jìn)制數(shù)組與結(jié)構(gòu)體的互轉(zhuǎn)方法

    C# 二進(jìn)制數(shù)組與結(jié)構(gòu)體的互轉(zhuǎn)方法

    本文將和大家介紹 MemoryMarshal 輔助類,通過這個輔助類用來實現(xiàn)結(jié)構(gòu)體數(shù)組和二進(jìn)制數(shù)組的相互轉(zhuǎn)換,對C# 二進(jìn)制數(shù)組與結(jié)構(gòu)體的互轉(zhuǎn)方法感興趣的朋友一起看看吧
    2023-09-09
  • C#中常使用進(jìn)度條的代碼

    C#中常使用進(jìn)度條的代碼

    C#中常使用進(jìn)度條的代碼...
    2007-03-03
  • Unity3D實現(xiàn)鼠標(biāo)控制旋轉(zhuǎn)轉(zhuǎn)盤

    Unity3D實現(xiàn)鼠標(biāo)控制旋轉(zhuǎn)轉(zhuǎn)盤

    這篇文章主要為大家詳細(xì)介紹了Unity3D實現(xiàn)鼠標(biāo)控制旋轉(zhuǎn)轉(zhuǎn)盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#利用GDI+畫圖的基礎(chǔ)實例教程

    C#利用GDI+畫圖的基礎(chǔ)實例教程

    編寫圖形程序時需要使用GDI(Graphics Device Interface,圖形設(shè)備接口),所以通過網(wǎng)上的相關(guān)資料整理了這篇文章,下面這篇文章主要給大家介紹了關(guān)于C#利用GDI+畫圖基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下。
    2018-04-04
  • 如何實現(xiàn)定時推送的具體方案

    如何實現(xiàn)定時推送的具體方案

    在工作當(dāng)中遇到了一個需要定時向客戶端推送新聞、文章等內(nèi)容。小項目又用不了大框架,這個時候在網(wǎng)上搜了很久沒有找到合適的解決方案,直到看到了一位大佬寫的文章提供了一個非常不錯的思路本篇文章也是受到他的啟發(fā)實現(xiàn)了之后這里分享給大家
    2021-04-04
  • C# 對象映射的高性能方案

    C# 對象映射的高性能方案

    這篇文章主要介紹了C# 對象映射的高性能方案,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,有需要的朋友可以借鑒參考下
    2020-12-12
  • C#深度優(yōu)先遍歷實現(xiàn)全排列

    C#深度優(yōu)先遍歷實現(xiàn)全排列

    這篇文章主要介紹了C#深度優(yōu)先遍歷實現(xiàn)全排列,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C#?Timer控件學(xué)習(xí)之使用Timer解決按鈕冪等性問題

    C#?Timer控件學(xué)習(xí)之使用Timer解決按鈕冪等性問題

    Timer控件又稱定時器控件或計時器控件,該控件的主要作用是按一定的時間間隔周期性地觸發(fā)一個名為Tick的事件,因此在該事件的代碼中可以放置一些需要每隔一段時間重復(fù)執(zhí)行的程序段,這篇文章主要介紹了關(guān)于C#使用Timer解決按鈕冪等性問題的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Unity3D使用Shader實現(xiàn)腐蝕消失

    Unity3D使用Shader實現(xiàn)腐蝕消失

    這篇文章主要為大家詳細(xì)介紹了Unity3D使用Shader實現(xiàn)腐蝕消失,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評論