C#调用SQLite

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

一、什么是SQLite

SQLite 是一个轻量级的数据库管理系统,它不必要一个独立的服务器进程或操作系统的运行,而是将整个数据库,包罗定义、表、索引以及数据本身,全部存储在一个独立的磁盘文件中。SQLite 被设计为简朴易用,它支持 SQL 语言的大部分功能,而且是跨平台的,可以在多种操作系统和硬件平台上运行,包罗桌面、服务器、移动装备等。

SQLite 的主要特点包罗:

  • 轻量级:SQLite 的源代码体积小,编译后的库文件也非常小巧,便于集成到各种应用程序中。
  • 无需设置:与必要复杂设置和安装过程的数据库系统差异,SQLite 不必要任何设置就可以直接利用。
  • 跨平台:SQLite 可以在多种操作系统上运行,包罗 Windows、macOS、Linux、Android 和 iOS 等。
  • 自包罗:SQLite 是一个自包罗的库,应用程序可以通过简朴的 API 调用直接与数据库交互。
  • 事务性:SQLite 支持事务,这意味着你可以确保数据的完备性,纵然在发生错误或系统崩溃的情况下。
  • 并发控制:SQLite 提供了一定程度的并发控制,答应多个进程或线程同时访问数据库。
  • 开源:SQLite 是一个开源项目,遵循宽松的公共领域许可证,可以免费利用,甚至可以在商业产物中利用。

二、C#调用SQLite

C#调用SQLite只必要利用System.Data.SQLite这个库即可,无需安装SQL,调用这个库即可在本地进行数据处理,轻量方便。
你可以通过NuGet包管理器来安装System.Data.SQLite库。在Visual Studio中,你可以通过“工具”->“NuGet包管理器”->“包管理器控制台”来安装。

三、编写SQLite的Helper类

        SQLite本身是SQL的语言进行编写的,如果你会利用SQL,那么调用对你而言没有什么难度;如果你不太会SQL,那么可以利用笔者的Helper类资助你快速利用SQLite。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SQLite;
  5. using System.Linq;
  6. using System.IO;
  7. namespace SqliteTest
  8. {
  9.     public class SQLiteHelper
  10.     {
  11.         /*******条件语法*******/
  12.         //1.简单的删除条件:Age > 40
  13.         //2.使用逻辑运算符:Age > 40 And Country = 'USA'
  14.         //3.使用IN运算符:IN运算符用于指定列的值必须属于一个特定的值列表:Category IN ('Electronics', 'Books', 'Toys')
  15.         //4.使用LIKE运算符:LIKE运算符用于在列的值中搜索特定的模式(通常用于字符串) Username LIKE 'j%';
  16.         //5.使用BETWEEN运算符:OrderDate BETWEEN '2023-01-01' AND '2023-03-31'
  17.         //6.使用IS NULL 或 IS NOT NULL:Manager IS NULL
  18.         // 用于与SQLite数据库交互的连接对象
  19.         private SQLiteConnection connection;
  20.         // 操作的表名
  21.         private string tableName;
  22.         // 表的列名,以逗号分隔的字符串
  23.         private string columnNameStr;
  24.         //表的列名
  25.         private string[] columnNames;
  26.         /// <summary>
  27.         /// 通过指定的数据库文件路径初始化SQLiteHelper类的实例。
  28.         /// </summary>
  29.         /// <param name="dbAddress">数据库文件的路径。</param>
  30.         public SQLiteHelper(string dbAddress)
  31.         {
  32.             // 创建SQLite连接字符串构建器,并设置数据源和版本
  33.             var connectionStringBuilder = new SQLiteConnectionStringBuilder
  34.             {
  35.                 DataSource = dbAddress,
  36.                 Version = 3
  37.             };
  38.             // 通过连接字符串构建器创建SQLite连接对象
  39.             connection = new SQLiteConnection(connectionStringBuilder.ConnectionString);
  40.             // 打开数据库连接
  41.             connection.Open();
  42.         }
  43.         /// <summary>
  44.         /// 关闭数据库连接。
  45.         /// </summary>
  46.         public void Close()
  47.         {
  48.             // 如果连接不为空且状态为打开,则关闭连接
  49.             if (connection != null && connection.State == ConnectionState.Open)
  50.             {
  51.                 connection.Close();
  52.             }
  53.         }
  54.         /// <summary>
  55.         /// 创建表,包括指定的列和类型。
  56.         /// </summary>
  57.         /// <param name="tableName">要创建的表名。</param>
  58.         /// <param name="hasAutoIncrementId">是否自动添加自增ID。</param>
  59.         /// <param name="columns">列名数组。</param>
  60.         /// <param name="columnTypes">列类型数组。</param>
  61.         public void CreateTable(string tableName, bool hasAutoIncrementId, string[] columns, Type[] columnTypes)
  62.         {
  63.             // 设置当前操作的表名
  64.             this.tableName = tableName;
  65.             // 设置列名字符串
  66.             columnNameStr = string.Join(",", columns);
  67.             columnNames = columns;  
  68.             // 创建列定义列表
  69.             var columnDefinitions = new List<string>();
  70.             // 如果需要自动添加ID列
  71.             if (hasAutoIncrementId)
  72.             {
  73.                 columnDefinitions.Add("ID INTEGER PRIMARY KEY AUTOINCREMENT");
  74.             }
  75.             // 遍历列类型数组,添加列定义
  76.             for (int i = 0; i < columns.Length; i++)
  77.             {
  78.                 var columnName = columns[i];
  79.                 var columnTypeStr = GetColumnType(columnTypes[i]);
  80.                 columnDefinitions.Add($"{columnName} {columnTypeStr}");
  81.             }
  82.             // 构建列定义字符串
  83.             string columnDefinitionsStr = string.Join(", ", columnDefinitions);
  84.             // 构建创建表的SQL语句
  85.             string sqlStr = $"CREATE TABLE IF NOT EXISTS {tableName} ({columnDefinitionsStr});";
  86.             // 执行非查询SQL命令创建表
  87.             ExecuteNonQuery(sqlStr);
  88.         }
  89.         /// <summary>
  90.         /// 删除当前的表
  91.         /// </summary>
  92.         public void DeleteTable()
  93.         {
  94.             string sql = $"DROP TABLE IF EXISTS {tableName};";
  95.             ExecuteNonQuery(sql);
  96.         }
  97.         /// <summary>
  98.         /// 创建索引以提高查询效率,在创建表之后使用
  99.         /// </summary>
  100.         /// <param name="columnName">要创建索引的列名。</param>
  101.         public void CreateIndex(string columnName)
  102.         {
  103.             string sql = $"CREATE INDEX IF NOT EXISTS {columnName} ON {tableName} ({columnName});";
  104.             ExecuteNonQuery(sql);
  105.         }
  106.         /// <summary>
  107.         /// 销毁指定的索引。
  108.         /// </summary>
  109.         /// <param name="indexName">要删除的索引的名称。</param>
  110.         public void DeleteIndex(string columnName)
  111.         {
  112.             string sql = $"DROP INDEX IF EXISTS {columnName};";
  113.             ExecuteNonQuery(sql);
  114.         }
  115.         /// <summary>
  116.         /// 获取C#类型对应的SQLite类型字符串。
  117.         /// </summary>
  118.         /// <param name="type">C#中的类型。</param>
  119.         /// <returns>对应的SQLite类型字符串。</returns>
  120.         private string GetColumnType(Type type)
  121.         {
  122.             // 根据C#类型返回对应的SQLite类型字符串
  123.             switch (Type.GetTypeCode(type))
  124.             {
  125.                 case TypeCode.Int32:
  126.                 case TypeCode.UInt32:
  127.                 case TypeCode.Int64:
  128.                 case TypeCode.UInt64:
  129.                     return "INTEGER";
  130.                 case TypeCode.Double:
  131.                     return "REAL";
  132.                 case TypeCode.Single:
  133.                     return "FLOAT";
  134.                 case TypeCode.DateTime:
  135.                     return "DATETIME";
  136.                 case TypeCode.Boolean:
  137.                     return "BOOLEAN";
  138.                 default:
  139.                     return "TEXT";
  140.             }
  141.         }
  142.         /// <summary>
  143.         /// 向表中插入记录。
  144.         /// </summary>
  145.         /// <param name="values">要插入的值的数组。</param>
  146.         /// <returns>插入操作影响的行数。</returns>
  147.         public int Insert(params object[] values)
  148.         {
  149.             // 创建参数列表并初始化
  150.             var parameters = values.Select((value, index) => new SQLiteParameter($"@{index}", value)).ToArray();
  151.             // 构建参数化SQL语句
  152.             var parameterNames = string.Join(", ", parameters.Select(p => p.ParameterName));
  153.             // 构建插入数据的SQL语句
  154.             string sql = $"INSERT INTO {tableName} ({columnNameStr}) VALUES ({parameterNames});";
  155.             // 执行非查询SQL命令并返回影响的行数
  156.             return ExecuteNonQuery(sql, parameters);
  157.         }
  158.         /// <summary>
  159.         /// 获取多条件的字符串组合
  160.         /// </summary>
  161.         /// <param name="bAnd">True为And逻辑,False 为 OR 逻辑</param>
  162.         /// <param name="condition1"></param>
  163.         /// <param name="condition2"></param>
  164.         /// <param name="conditions"></param>
  165.         /// <returns></returns>
  166.         public string GetMultiContidion(bool bAnd, string condition1, string condition2, params string[] conditions)
  167.         {
  168.             if (bAnd)
  169.             {
  170.                 if (conditions != null && conditions.Length > 0)
  171.                 {
  172.                     string str1 = string.Join(" And ", conditions);
  173.                     return string.Join(" And ", condition1, condition2, str1);
  174.                 }
  175.                 else
  176.                 {
  177.                     return string.Join(" And ", condition1, condition2);
  178.                 }
  179.             }
  180.             else
  181.             {
  182.                 if (conditions != null && conditions.Length > 0)
  183.                 {
  184.                     string str1 = string.Join(" OR ", conditions);
  185.                     return string.Join(" OR ", condition1, condition2, str1);
  186.                 }
  187.                 else
  188.                 {
  189.                     return string.Join(" OR ", condition1, condition2);
  190.                 }
  191.             }
  192.         }
  193.         /// <summary>
  194.         /// 根据条件删除记录。
  195.         /// </summary>
  196.         /// <param name="condition">删除条件。</param>
  197.         /// <returns>删除操作影响的行数。</returns>
  198.         public int Delete(string condition)
  199.         {
  200.             // 构建删除数据的SQL语句
  201.             string sql = $"DELETE FROM {tableName} WHERE {condition};";
  202.             // 执行非查询SQL命令并返回影响的行数
  203.             return ExecuteNonQuery(sql);
  204.         }
  205.         /// <summary>
  206.         /// 更新表中的记录。
  207.         /// </summary>
  208.         /// <param name="columnName">要更新的列名。</param>
  209.         /// <param name="value">新的值。</param>
  210.         /// <param name="condition">更新条件。</param>
  211.         /// <returns>更新操作影响的行数。</returns>
  212.         public int Update(string columnName, object value, string condition)
  213.         {
  214.             // 构建更新数据的SQL语句
  215.             string query = $"UPDATE {tableName} SET {columnName} = @{value} WHERE {condition};";
  216.             // 创建参数对象并添加到SQL命令中
  217.             var parameter = new SQLiteParameter(value.ToString(), value);
  218.             // 执行非查询SQL命令并返回影响的行数
  219.             return ExecuteNonQuery(query, parameter);
  220.         }
  221.         /// <summary>
  222.         /// 根据条件查询列的值。
  223.         /// </summary>
  224.         /// <param name="columnName">要查询的列名。</param>
  225.         /// <param name="condition">查询条件。</param>
  226.         /// <returns>查询结果的值。</returns>
  227.         public object GetValue(string columnName, string condition)
  228.         {
  229.             // 构建查询数据的SQL语句
  230.             string selectQuery = $"SELECT {columnName} FROM {tableName} WHERE {condition};";
  231.             // 执行查询SQL命令并返回查询结果
  232.             return ExecuteScalar(selectQuery);
  233.         }
  234.         /// <summary>
  235.         /// 根据条件查询列的值。
  236.         /// </summary>
  237.         /// <param name="columnName">要查询的列名。</param>
  238.         /// <param name="condition">查询条件。</param>
  239.         /// <returns>查询结果的值。</returns>
  240.         public List<object> GetValues(string columnName, string condition)
  241.         {
  242.             List<object> values = new List<object>();
  243.             string selectQuery = "";
  244.             if (string.IsNullOrWhiteSpace(condition))
  245.             {
  246.                 selectQuery = $"SELECT {columnName} FROM {tableName};";
  247.             }
  248.             else
  249.             {
  250.                 selectQuery = $"SELECT {columnName} FROM {tableName} WHERE {condition};";
  251.             }
  252.             try
  253.             {
  254.                 using (var reader = ExecuteQuery(selectQuery))
  255.                 {
  256.                     while (reader.Read())
  257.                     {
  258.                         values.Add(reader[columnName]);
  259.                     }
  260.                 }
  261.             }
  262.             catch (Exception ex)
  263.             {
  264.                 LogException(ex);
  265.             }
  266.             return values;
  267.         }
  268.         /// <summary>
  269.         /// 根据条件获取所有行的数据
  270.         /// </summary>
  271.         /// <param name="condition"></param>
  272.         /// <returns></returns>
  273.         public List<Dictionary<string, object>> GetRowDatas(string condition)
  274.         {
  275.             List<Dictionary<string, object>> values = new List<Dictionary<string, object>>();
  276.             string selectQuery = "";
  277.             if (string.IsNullOrWhiteSpace(condition))
  278.             {
  279.                 selectQuery = $"SELECT {columnNameStr} FROM {tableName};";
  280.             }
  281.             else
  282.             {
  283.                 selectQuery = $"SELECT {columnNameStr} FROM {tableName} WHERE {condition};";
  284.             }
  285.             try
  286.             {
  287.                 using (var reader = ExecuteQuery(selectQuery))
  288.                 {
  289.                     while (reader.Read())
  290.                     {
  291.                         Dictionary<string,object > dict = new Dictionary<string,object>();
  292.                         foreach (var columnName in columnNames)
  293.                         {
  294.                             dict.Add(columnName, reader[columnName]);
  295.                         }
  296.                         values.Add(dict);
  297.                     }
  298.                 }
  299.             }
  300.             catch (Exception ex)
  301.             {
  302.                 LogException(ex);
  303.             }
  304.             return values;
  305.         }
  306.       
  307.         /// <summary>
  308.         /// 执行非查询SQL命令(如INSERT, UPDATE, DELETE)。
  309.         /// </summary>
  310.         /// <param name="sql">SQL命令字符串。</param>
  311.         /// <param name="parameters">SQL命令参数数组。</param>
  312.         /// <returns>命令执行影响的行数。</returns>
  313.         public int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)
  314.         {
  315.             try
  316.             {
  317.                 // 使用SQLiteCommand对象执行SQL命令
  318.                 using (var command = connection.CreateCommand())
  319.                 {
  320.                     command.CommandText = sql;
  321.                     if (parameters != null)
  322.                     {
  323.                         command.Parameters.AddRange(parameters);
  324.                     }
  325.                     return command.ExecuteNonQuery();
  326.                 }
  327.             }
  328.             catch (Exception ex)
  329.             {
  330.                 // 记录异常信息到日志文件
  331.                 LogException(ex);
  332.                 return 0;
  333.             }
  334.         }
  335.         /// <summary>
  336.         /// 执行查询SQL命令(如SELECT),返回SQLiteDataReader对象。
  337.         /// </summary>
  338.         /// <param name="sql">SQL命令字符串。</param>
  339.         /// <returns>SQLiteDataReader对象。</returns>
  340.         private SQLiteDataReader ExecuteQuery(string sql)
  341.         {
  342.             try
  343.             {
  344.                 using (var command = connection.CreateCommand())
  345.                 {
  346.                     command.CommandText = sql;
  347.                     return command.ExecuteReader();
  348.                 }
  349.             }
  350.             catch (Exception ex)
  351.             {
  352.                 LogException(ex);
  353.                 return null;
  354.             }
  355.         }
  356.         /// <summary>
  357.         /// 执行查询SQL命令(如SELECT),返回单个结果。
  358.         /// </summary>
  359.         /// <param name="sql">SQL命令字符串。</param>
  360.         /// <returns>查询结果的单个值。</returns>
  361.         private object ExecuteScalar(string sql)
  362.         {
  363.             try
  364.             {
  365.                 using (var command = connection.CreateCommand())
  366.                 {
  367.                     command.CommandText = sql;
  368.                     return command.ExecuteScalar();
  369.                 }
  370.             }
  371.             catch (Exception ex)
  372.             {
  373.                 LogException(ex);
  374.                 return null;
  375.             }
  376.         }
  377.         /// <summary>
  378.         /// 记录异常信息到日志文件。
  379.         /// </summary>
  380.         /// <param name="ex">要记录的异常对象。</param>
  381.         private void LogException(Exception ex)
  382.         {
  383.             // 将异常信息追加到日志文件中
  384.             string errorMessage = $"发生错误:{ex.Message}{Environment.NewLine}{ex.StackTrace}";
  385.             File.AppendAllText("error.log", errorMessage);
  386.         }
  387.     }
  388. }
复制代码
四、怎样利用SQLiteHelper类

直接给出测试代码,根据根据测试代码了解封装的用法
在这个例子中,首先创建了一个SQLiteHelper实例,并指定了数据库文件的路径。然后,利用CreateTable方法创建了一个名为Articles的表,用于存储文章的标题、内容、作者和创建日期。
接下来,通过Insert方法向表中插入了一条文章记载。然后,利用GetRowDatas方法查询了包罗特定关键词的文章,并打印了查询结果。
之后,通过Update方法更新了文章的标题。注意,这里的更新条件是ID = 1,这意味着只有ID为1的文章会被更新。
接着,通过Delete方法删除了ID为1的文章记载。
还展示了怎样创建和删除索引来提高查询效率。在这个例子中,首先为Title列创建了一个索引,然后又删除了它。
最后,调用Close方法关闭了数据库毗连。
  1. using System;
  2. class Program
  3. {
  4.     static void Main()
  5.     {
  6.         // 数据库文件路径
  7.         string dbPath = "blog.db";
  8.         // 创建SQLiteHelper实例
  9.         SQLiteHelper dbHelper = new SQLiteHelper(dbPath);
  10.         // 1. 创建文章表
  11.         dbHelper.CreateTable("Articles",
  12.             hasAutoIncrementId: true,
  13.             columns: new string[] { "Title", "Content", "Author", "CreateDate" },
  14.             columnTypes: new Type[] { typeof(string), typeof(string), typeof(string), typeof(DateTime) });
  15.         // 2. 插入文章
  16.         object[] article1 = new object[] { "我的旅行日记", "这是一篇关于旅行的日记。", "小明", DateTime.Now };
  17.         int rowsAffected = dbHelper.Insert(article1);
  18.         Console.WriteLine($"插入文章记录,影响行数:{rowsAffected}");
  19.         // 3. 查询文章
  20.         string condition = "Title LIKE '%旅行%'";
  21.         List<object> articles = dbHelper.GetRowDatas(condition);
  22.         Console.WriteLine("查询包含'旅行'的文章:");
  23.         foreach (var article in articles)
  24.         {
  25.             Console.WriteLine($"标题: {article["Title"]}, 作者: {article["Author"]}, 创建日期: {article["CreateDate"]}");
  26.         }
  27.         // 4. 更新文章
  28.         object[] article2 = new object[] { "更新的旅行日记", "这是一篇更新后的关于旅行的日记。" };
  29.         int updateRowsAffected = dbHelper.Update("Title", article2[0], "ID = 1");
  30.         Console.WriteLine($"更新文章记录,影响行数:{updateRowsAffected}");
  31.         // 5. 删除文章
  32.         int deleteRowsAffected = dbHelper.Delete("ID = 1");
  33.         Console.WriteLine($"删除文章记录,影响行数:{deleteRowsAffected}");
  34.         // 6. 创建索引以提高查询效率
  35.         dbHelper.CreateIndex("Title");
  36.         // 7. 删除不再需要的索引
  37.         dbHelper.DeleteIndex("Title");
  38.         // 8. 关闭数据库连接
  39.         dbHelper.Close();
  40.     }
  41. }
复制代码
五、DB文件检察器

利用SQLiteSpy这个文件即可检察数据库文件,方便排盘问题



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表