首页 > 数据库 >Sqlite数据库操作

Sqlite数据库操作

时间:2024-11-06 15:47:10浏览次数:2  
标签:Sqlite return 数据库 new SQLiteConnection query 操作 property sqliteConn

 public class SQLiteOperation
 {
     /// <summary>
     /// 数据库位置
     /// </summary>
     private static readonly string FilePath = Environment.CurrentDirectory + @"\PARAM\SQLiteDatabase.db";

     public SQLiteOperation()
     {
         Init();
     }

     /// <summary>
     /// 初始化
     /// </summary>
     private void Init()
     {
         //可在这初始化创建所需要的固定的数据表
     }

     #region 创建数据库和数据表

     /// <summary>
     /// 创建数据表
     /// </summary>
     /// <param name="table"></param>
     /// <param name="model"></param>
     /// <returns></returns>
     public bool CreateDataTable<T>(string table, T model) where T : class
     {
         if(IsTableExist(table))
         {
             return true;
         }
         var str = "CREATE TABLE " + table + "(";

         var Property_Types = GetPropertyType(model);

         foreach(var type in Property_Types)
         {
             str += $"{type.Key} {type.Value},";
         }
         str = str.Remove(str.Length - 1) + ")";

         try
         {
             using(SQLiteConnection sqliteConn = new SQLiteConnection("data source=" + FilePath))
             {
                 if(sqliteConn.State != System.Data.ConnectionState.Open)
                 {
                     sqliteConn.Open();
                     using(SQLiteCommand cmd = new SQLiteCommand())
                     {
                         cmd.Connection = sqliteConn;
                         cmd.CommandText = str;
                         cmd.ExecuteNonQuery();
                     }
                 }
                 sqliteConn.Close();
             }

             return true;
         }
         catch(Exception)
         {
             return false;
         }
     }

     /// <summary>
     /// 创建数据库文件
     /// </summary>
     /// <returns></returns>
     private bool CreateDataBase()
     {
         if(File.Exists(FilePath))
         {
             return true;
         }

         try
         {
             SQLiteConnection.CreateFile(FilePath);
             return true;
         }
         catch(Exception)
         {
             return false;
         }
     }

     /// <summary>
     /// 判断数据表是否存在
     /// </summary>
     /// <param name="Table"></param>
     /// <returns></returns>
     private bool IsTableExist(string Table)
     {
         using(SQLiteConnection sqliteConn = new SQLiteConnection("data source=" + FilePath))
         {
             sqliteConn.Open();
             //sqlite_master系统表
             var checkTableQuery = $"SELECT name FROM sqlite_master WHERE type='table' AND name='{Table}'";
             using(SQLiteCommand command = new SQLiteCommand(checkTableQuery, sqliteConn))
             {
                 using(SQLiteDataReader reader = command.ExecuteReader())
                 {
                     if(reader.Read())
                     {
                         sqliteConn.Close();
                         return true;
                     }
                     else
                     {
                         sqliteConn.Close();
                         return false;
                     }
                 }
             }
         }
     }

     #endregion

     #region 增

     /// <summary>
     /// 插入数据
     /// </summary>
     /// <param name="Table"></param>
     /// <param name="model">实体类</param>
     /// <returns></returns>
     public bool InsertData<T>(string Table, T model) where T : class
     {
         string query = $"insert into {Table}(";
         var Property_Values = GetPropertyValue(model);

         foreach(var property in Property_Values)
         {
             query += property.Key + ",";
         }
         query = query.Remove(query.Length - 1) + ") values(";

         foreach(var property in Property_Values)
         {
             if(property.Key == "DateTime")
             {
                 //查询数据读取DateTime会报错:异常详细信息:  System.FormatException: 该字符串未被识别为有效的 DateTime。
                 //格式化.ToString()方法中加一个s,即可解决日期读取错误的问题。格式化后有个T在中间,去掉
                 var datatime = ((DateTime)(property.Value)).ToString("s").Replace("T"," ");
                 query += $"'{datatime}',";
                 continue;
             }

             query += $"'{property.Value}',";
         }
         query = query.Remove(query.Length - 1) + ")";

         try
         {
             using(SQLiteConnection sqliteConn = new SQLiteConnection($"data source={FilePath}"))
             {
                 sqliteConn.Open();
                 using(SQLiteCommand cmd = new SQLiteCommand(query, sqliteConn))
                 {
                     cmd.ExecuteNonQuery();
                 }
                 sqliteConn.Close();
             }
             return true;
         }
         catch(Exception)
         {
             return false;
         }
     }
     #endregion

     #region 删
     /// <summary>
     /// 删除数据
     /// </summary>
     /// <param name="Table">表</param>
     /// <param name="dics">条件键值对</param>
     /// <returns></returns>
     public bool DeleteData(string Table, Dictionary<string, object> dics)
     {
         var query = $"delete from {Table} where ";

         foreach(var dic in dics)
         {
             query += $"{dic.Key}='{dic.Value}' And ";
         }

         query = query.Remove(query.Length - 5);

         try
         {
             using(SQLiteConnection sqliteConn = new SQLiteConnection($"data source={FilePath}"))
             {
                 sqliteConn.Open();
                 using(SQLiteCommand cmd = new SQLiteCommand(query, sqliteConn))
                 {
                     cmd.ExecuteNonQuery();
                 }
                 sqliteConn.Close();
             }
             return true;
         }
         catch(Exception)
         {
             return false;
         }
     }

     #endregion

     #region 查
     /// <summary>
     /// 根据日期查询数据
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="Table"></param>
     /// <param name="StartDateTime"></param>
     /// <param name="EndDateTime"></param>
     /// <returns></returns>
     public List<T> QueryData<T>(string Table, DateTime StartDateTime, DateTime EndDateTime) where T : class, new()
     {
         try
         {
             var StartTime = StartDateTime.ToString("yyyy-MM-dd") + " 00:00:00";
             var EndTime = EndDateTime.ToString("yyyy-MM-dd") + " 23:59:59";

             using(SQLiteConnection sqliteConn = new SQLiteConnection($"data source={FilePath}"))
             {
                 sqliteConn.Open();
                 string query = $"select * from {Table} where DateTime between '{StartTime}' and '{EndTime}'";
                 using(SQLiteCommand cmd = new SQLiteCommand(query, sqliteConn))
                 {
                     SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                     DataTable dt = new DataTable();
                     da.Fill(dt);

                     sqliteConn.Close();
                     return DataTableConvert<T>(dt);
                 }
             }
         }
         catch(Exception)
         {
             return null;
         }
     }

     /// <summary>
     /// 查询所有数据,返回List<T>类型结果
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="Table"></param>
     /// <returns></returns>
     public List<T> QueryAllData<T>(string Table) where T : class, new()
     {
         try
         {

             using(SQLiteConnection sqliteConn = new SQLiteConnection($"data source={FilePath}"))
             {
                 sqliteConn.Open();
                 string query = $"select * from {Table}";

                 SQLiteCommand cmd = new SQLiteCommand(query, sqliteConn);
                 SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
                 DataTable dt = new DataTable();
                 da.Fill(dt);

                 sqliteConn.Close();

                 return DataTableConvert<T>(dt);
             }
         }
         catch(Exception)
         {
             return null;
         }
     }
     #endregion

     #region Common

     /// <summary>
     /// 获得对应(属性-类型)键值对
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="model"></param>
     /// <returns></returns>
     private Dictionary<string, object> GetPropertyType<T>(T model) where T : class
     {
         //使用反射获取所有属性
         PropertyInfo[] properties = model.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);
         //创建一个字典来存储属性和对应类型
         var Property_Types = new Dictionary<string,object>();
         foreach(PropertyInfo property in properties)
         {
             // 检查属性是否有getter,以便可以读取其对应类型
             if(property.CanRead)
             {
                 Property_Types[property.Name] = property.PropertyType.ToString().Replace("System.", "");
             }
         }
         return Property_Types;
     }

     /// <summary>
     /// 获得对应(属性-值)键值对
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="model"></param>
     /// <returns></returns>
     private Dictionary<string, object> GetPropertyValue<T>(T model) where T : class
     {
         //使用反射获取所有属性
         PropertyInfo[] properties = model.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);
         //创建一个字典来存储属性和对应类型
         var Property_Values = new Dictionary<string,object>();
         foreach(PropertyInfo property in properties)
         {
             // 检查属性是否有getter,以便可以读取其对应类型
             if(property.CanRead)
             {
                 Property_Values[property.Name] = property.GetValue(model);
                 if(Property_Values[property.Name] == null)
                 {
                     Property_Values[property.Name] = string.Empty;
                 }
             }
         }
         return Property_Values;
     }

     /// <summary>
     /// 判断该表是否含有该键
     /// </summary>
     /// <param name="Table"></param>
     /// <param name="Property"></param>
     /// <returns></returns>
     private bool IsLegalJudge(string Table, string Property)
     {
         List<string> lists = new List<string>();
         using(SQLiteConnection connection = new SQLiteConnection($"data source={FilePath}"))
         {
             connection.Open();

             // 使用PRAGMA table_info来获取表的架构信息
             string query = $"PRAGMA table_info({Table})";
             using(SQLiteCommand command = new SQLiteCommand(query, connection))
             using(SQLiteDataReader reader = command.ExecuteReader())
             {
                 while(reader.Read())
                 {
                     // 读取列名(name字段)
                     string columnName = reader.GetString(1); // 第二列是列名
                     lists.Add(columnName);
                 }
             }
         }

         foreach(var list in lists)
         {
             if(list == Property)
                 return true;
         }

         return false;
     }

     /// <summary>
     /// DataTable转化为List<T>结果列表
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="dt"></param>
     /// <returns></returns>
     private List<T> DataTableConvert<T>(DataTable dt) where T : class, new()
     {
         List<T> ResultList = new List<T>();
         foreach(DataRow dr in dt.Rows)
         {
             T obj = new T();
             foreach(PropertyInfo info in obj.GetType().GetProperties())
             {
                 if(dt.Columns.Contains(info.Name))
                 {
                     if(dr[info.Name] != DBNull.Value)
                     {
                         info.SetValue(obj, dr[info.Name], null);
                     }
                 }
             }
             ResultList.Add(obj);
         }
         return ResultList;
     }

     #endregion
 }

 

标签:Sqlite,return,数据库,new,SQLiteConnection,query,操作,property,sqliteConn
From: https://www.cnblogs.com/shieryoufeng/p/18530375

相关文章

  • Springboot 容器启动之后初始化操作
    在项目开发中,有时候会在Spring应用启动后做一些初始化的操作,比如数据字典缓存,状态通知,配置读取等操作。SpringBoot提供了多种方式可以让开发者在容器启动后来执行一个任务:使用@PostConstruct注解通过ApplicationListener监听SpringBoot启动过程中的发布的Event事件:......
  • Cmake 实操 -- 使用文件操作命令添加源码文件并移除失效问题记录
    搜索文件使用file(GLOB_RECURSEfileListsearchDir/*.cpp)搜索searchDir目录下所有cpp文件,将路径保存到fileList中。GLOB_RECURSE:启用递归搜索。ps:searchDir不会被展开,如果searchDir中存在C/test/../test1,保存到fileList中的文件路径将仍然带有C/test/../test1,而不是C/test1......
  • #渗透测试#SRC漏洞挖掘# 操作系统-Linux系统基础04之内存管理
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。                            ......
  • Springboot医院门诊管理系统0qzik(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表科室信息,医生,患者,坐诊信息,挂号记录,检查项目,沟通交流,药品信息,就诊记录,入库记录,出库记录,医生排班开题报告内容一、研究背景与意义随着医疗技术的飞速......
  • Springboot医院固定资产系统d9y56(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表固定资产,资产入库,资产出库,科室,资产申购,资产申领开题报告内容一、项目背景与意义在现代医疗机构的运营管理中,固定资产的管理是一项至关重要的工作。随着医......
  • 实验4:二叉树的基本操作
    c++解释:new相当于malloc()函数,其他没有区别!点击查看代码#include<iostream>usingnamespacestd;structtree{ intdata; tree*light,*ture;};intjie,shen,maxx;//创建tree*chu(){ tree*head; head=newtree; cout<<"请输入数值:\n"; cin>&g......
  • W外链如何创建短链接?详细操作步骤。
    根据搜索结果,创建微信外链并将长链接转换为短链接,可以通过使用W外链工具来实现。以下是使用W外链进行长链接转短链接的步骤:注册与登录:打开W外链平台的官方网站,注册一个账号,通常需要提供手机号、用户名、密码等信息。注册成功后,使用用户名和密码登录到平台。生成短链接:准备......
  • 《女神异闻录5皇家版》游戏辅助工具修改器操作手册:一键开启金手指
    《女神异闻录5皇家版》(Persona5Royal)是一款深受玩家喜爱的角色扮演游戏。对于希望使用游戏辅助工具或修改器的玩家来说,重要的是要确保所使用的工具是可靠的,并且遵守游戏的服务条款。不当使用修改器可能导致游戏账户被封禁。如果你仍然想了解如何使用修改器,请按照以下一般......
  • 《仙剑客栈2》游戏辅助工具全面操作手册与使用技巧详解
    《仙剑客栈2》是一款结合了模拟经营和角色扮演元素的游戏,玩家在游戏中需要管理一家客栈,同时还要处理各种冒险和故事情节。风灵月影团队制作的修改器可以帮助玩家在游戏中获得更多的便利和乐趣。以下是一个全面的操作手册和使用技巧详解,帮助你更好地使用这款修改器。修改器功能......
  • 在 Windows Server 2025 中,您可以通过 Certutil、PowerShell 和证书管理器工具来进行
    certmgr.msc是Windows操作系统中的一个管理工具,它用于管理和查看证书存储。通过certmgr.msc,用户可以方便地浏览和管理个人证书、受信任的根证书颁发机构(CA)、中间证书颁发机构等不同证书存储区。 1. certmgr.msc 是什么?certmgr.msc是证书管理器(CertificateM......