C# 中 SQLite 使用介绍

C# 中 SQLite 使用介绍,第1张

概述关于SQLite         SQLite是一款轻型的嵌入式的遵守ACID的关系型数据库管理系统,诞生已有15个年头了。随着移动互联的发展,现在得到了更广泛的使用。在使用SQLite之前,我们势必要先了解它一些“个性”的地方。下面是它的一些特点:1、  自包含。SQLite很大层度上是独立的,他只需要非常小的外部库支持。任何程序能够访问磁盘就可以使用SQLite数据库。这使它适用于
关于sqlite

         sqlite是一款轻型的嵌入式的遵守ACID的关系型数据库管理系统,诞生已有15个年头了。随着移动互联的发展,现在得到了更广泛的使用。

在使用sqlite之前,我们势必要先了解它一些“个性”的地方。下面是它的一些特点:

1、  自包含。sqlite很大层度上是独立的,他只需要非常小的外部库支持。任何程序能够访问磁盘就可以使用sqlite数据库。这使它适用于嵌入式设备,缺乏桌面计算机支持的基础设施。这也使得sqlite适用于不作任何修改就可运行在不同配置电脑上的程序。

2、  无服务器。大多数sql数据库引擎被实现为一个单独的服务器进程。程序要访问数据库与服务器通信使用某种形式的进程间通信(通常是TCP / IP),向服务器发送请求并接收返回结果。sqlite则不是这种工作方式。对于sqlite,想要访问数据库直接从磁盘上的对数据库文件执行读和写 *** 作。没有中间的服务器进程。

3、  零配置。使用sqlite不需要“安装”。没有“设置”程序。没有服务器进程需要启动,停止,或配置。不需要管理员来创建一个新的数据库实例或访问权限分配给用户。sqlite不使用配置文件。

4、  支持事务。事务数据库的所有更改和查询表现出原子性、一致性、隔离性、持久性(ACID)。执行sqlite的事务 *** 作时,要么完全执行,要么不执行,即使写入磁盘的 *** 作被程序崩溃,断电等故障打断。

5、  开源。和前面的特点相比,这个似乎没有多大关系。之所以把它作为一个特点,是因为开源在很大层度上会成为我们选择一个解决方案的重要维度。

 

  除了这些,sqlite还有着比同是开源的MysqL、Postgresql数据库更快的处理效率,更低的资源占用。看起来很“完美”的东西背后往往也有着致命的缺陷。sqlite的缺陷虽不能说致命,但也足以让你在选择的过程中说NO。如果你要求更精准的控制数据库访问,细粒度锁(sqlite只提供数据库级的锁定)以及很好的并发性(虽然可以手动实现并发,但是性能不高,也容易出现死锁),sqlite也许不适合你。另外,sqlite也不适合远程访问,虽然可以通过网络共享的方式运行,但是会存在文件锁定的问题,而且访问网络共享相关的延迟会导致性能的下降。

 

安装配置

         前面说过了,使用sqlite是超级简单的,无需安装,只需要在官网下载库文件添加引用即可。当然,还有很简单的一些配置。还有更简单的方法,使用Nuget添加sqlite库文件并自动配置,这简直是一键搞定啊。

首先,在Nuget中找到sqlite。这里我们选择第一个安装。

 

 

  会自动安装如下库。

 

 

  安装后会自动添加如下库的引用。

 

  并自动添加如下配置。

 1 <?xml version="1.0" enCoding="utf-8"?> 2 <configuration> 3   configSections 4     <!-- For more information on Entity Framework configuration,visit http://go.microsoft.com/fwlink/?linkID=237468 --> 5     section name="entityFramework" 6       type="System.Data.Entity.Internal.Configfile.EntityFrameworkSection,EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" 7       requirePermission="false"/> 8   </ 9   10   entityFramework11     defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory,EntityFramework"12       parameters13         parameter value="v11.0"14       15     defaultConnectionFactory16     provIDers17       provIDer invariantname="System.Data.sqlClIEnt" type="System.Data.Entity.sqlServer.sqlProvIDerServices,EntityFramework.sqlServer"18       ="System.Data.sqlite.EF6"="System.Data.sqlite.EF6.sqliteProvIDerServices,System.Data.sqlite.EF6"19     20   21 system.data22     DbProvIDerFactorIEs23     remove invariant="System.Data.sqlite.EF6"/><add ="sqlite Data ProvIDer (Entity Framework 6)" invariant="System.Data.sqlite.EF6"24         description=".NET Framework Data ProvIDer for sqlite (Entity Framework 6)"="System.Data.sqlite.EF6.sqliteProvIDerFactory,255); line-height:1.5!important">/></25   ></>

 

sqlite的使用 

         上面的准备工作已经就绪。接下来开始使用sqlite。这里不对如何创建数据库作介绍,在实际工作中,我一般会选择使用Navicat for SQLite来创建数据库,方便快捷。如果有编码创建数据库要求,自行问度娘。如果要使用linq,别忘了添加System.Data.linq的引用。

  1     /// <summary>  2     /// sqlite数据库帮助类  3     </summary>  4     public class sqliteHelper  5     {  6           7          数据库路径  8           9         private static Readonly string m_DataSource = ConfigurationManager.AppSettings["Test"]; 10  11          12          ConnectionString样例:Data Source=Test.db;Pooling=true;FailifMissing=false 13          14         string m_ConnectionString; 15  16          17          静态构造函数,初始化连接字符串,检查数据库连接 18          19         static sqliteHelper() 20         { 21             try 22             { 23                 sqliteConnectionStringBuilder connectionStringBuilder = new sqliteConnectionStringBuilder 24                 { 25                     Version = 3, 26                     Pooling = true,128); line-height:1.5!important"> 27                     FailifMissing = false,128); line-height:1.5!important"> 28                     DataSource = m_DataSource 29                 }; 30                 m_ConnectionString = connectionStringBuilder.ConnectionString; 31                 using (sqliteConnection conn = new sqliteConnection(m_ConnectionString)) 32                 { 33                     conn.open(); 34                 } 35             } 36             catch { } 37         } 38  39         #region basic method 40  41          42          获得连接对象 43          44         <returns></returns> 45         static sqliteConnection GetsqliteConnection() 46         { 47             return new sqliteConnection(m_ConnectionString); 48         } 49  50          51          预备命令 52          53         <param name="cmd"></param> 54         <param name="conn"></param> 55         <param name="cmdText"></param> 56         <param name="commandParameters"></param> 57         voID PrepareCommand(sqliteCommand cmd,sqliteConnection conn,string cmdText,255); line-height:1.5!important">params object[] commandParameters) 58         { 59             if (conn.State != ConnectionState.Open) 60                 conn.open(); 61             cmd.Parameters.Clear(); 62             cmd.Connection = conn; 63             cmd.CommandText = cmdText; 64             cmd.CommandType = CommandType.Text; 65             cmd.CommandTimeout = 30; 66             if (commandParameters != null) 67             { 68                 foreach (object parm in commandParameters) 69                     cmd.Parameters.AdDWithValue(string.Empty,parm); 70  71                 //for (int i = 0; i < p.Length; i++) 72                     cmd.Parameters[i].Value = p[i]; 73             } 74         } 75  76          77          返回受影响的行数 78          79         <param name="cmdText">执行语句</param> 80         <param name="commandParameters">传入的参数 81         <returns>返回受影响行数</returns> 82         int ExecuteNonquery( 83         { 84             sqliteCommand command = new sqliteCommand(); 85             using (sqliteConnection connection = GetsqliteConnection()) 86             { 87                 PrepareCommand(command,connection,cmdText,commandParameters); 88                 return command.ExecuteNonquery(); 89             } 90         } 91  92          93          返回表集合 94          95          96          97         返回DataSet 98         static DataSet ExecuteDataset( 99         {100             DataSet ds = new DataSet();101             sqliteCommand command = 102             103             {104                 PrepareCommand(command,128); line-height:1.5!important">105                 sqliteDataAdapter da = new sqliteDataAdapter(command);106                 da.Fill(ds);107             }108             return ds;109         }110 111         112          返回sqlDataReader对象113         114         115         116         返回sqliteDataReader117         static sqliteDataReader ExecuteReader(118         {119             sqliteCommand command = 120             sqliteConnection connection = GetsqliteConnection();121             122             {123                 PrepareCommand(command,128); line-height:1.5!important">124                 sqliteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);125                 return reader;126             }127             catch128             {129                 connection.Close();130                 throw;131             }132         }133 134         135          返回表第一行136         137         138         139         返回:第一行140         static DaTarow ExecuteDaTarow(141         {142             DataSet ds = ExecuteDataset(cmdText,128); line-height:1.5!important">143             if (ds != null && ds.tables.Count > 0 && ds.tables[0].Rows.Count > 0)144                 return ds.tables[0].Rows[0];145             null;146         }147 148         149          返回结果集中的第一行第一列,忽略其他行或列150         151         152         153         返回:第一行第一列154         object ExecuteScalar(155         {156             sqliteCommand cmd = 157             158             {159                 PrepareCommand(cmd,128); line-height:1.5!important">160                 return cmd.ExecuteScalar();161             }162         }163 164         #endregion165 166 167         #region advanced method168 169         170          获取表所有数据171         172         <typeparam name="T">实体类型</typeparam>173         <param name="tablename">表名174         表所有数据175         static List<T> GettableData<T>(string tablename) where T : class176         {177             List<T> dataList = new List<T>();178             179             {180                 using (sqliteDataContext context = new sqliteDataContext(new sqliteConnection(m_ConnectionString)))181                 {182                     string sql = select * from " + tablename;183                     dataList = context.Executequery<T>(sql).ToList();184                     context.submitChanges();185                 }186             }187             188             return dataList;189         }190 191         192          获取表数据193         194         195         SQL语句196         <param name="parameter">参数197         198         object[] parameter) 199         {200             List<T> dataList = 201             202             {203                 204                 {205                     dataList = context.Executequery<T>(cmdText,parameter).ToList();206                 }207             }208             catch {}209             210         }211 212         213          插入表数据214         215         数据类型216         217         <param name="dataList">数据集合218         true或false219         bool BatchInsert<T>(string tablename,List<T> dataList)220         {221             222             {223                 if (dataList != null && dataList.Count > 224                 {225                     var temp = dataList[226                     PropertyInfo[] propertyInfos = temp.GetType().GetPropertIEs();227                     List<string> propertyStrs = new List<string>();228                     string propertyStr = "";229                     var propertyInfo in propertyInfos)230                     {231                         propertyStrs.Add(propertyInfo.name);232                         propertyStr = propertyStr + @" + propertyInfo.name + ,";233                     }234                     propertyStr = propertyStr.Remove(propertyStr.Length - 1);235 236                     237                     {238                         using (sqliteCommand command = new sqliteCommand(conn))239                         {240                             command.Connection.open();241                             using (sqliteTransaction transaction = conn.BeginTransaction())242                             {243                                 command.Transaction = transaction;244                                 command.CommandText = insert into " + tablename +  values(" + propertyStr + )245                                 var needInsertData in dataList)246                                 {247                                     command.Parameters.Clear();248                                     for (int i = 0; i < propertyStrs.Count; i++)249                                     {250                                         command.Parameters.AdDWithValue(" + propertyStrs[i],propertyInfos[i].GetValue(needInsertData,255); line-height:1.5!important">null));251                                     }252                                     command.ExecuteNonquery();253                                 }254                                 transaction.Commit();255                             }256                         }257                     }258                 }259             }260             catch (Exception ex)261             {262                 false;263             }264             true;265         }266 267         268          删除表数据269         270         271         272         bool DeletetableData(string tablename)273         {274             275             {276                 277                 {278                     279                     {280                         command.Connection.open();281                         command.CommandText = delete from 282                         command.ExecuteNonquery();283                     }284                 }285             }286             287             {288                 289             }290             291         }292 293         294     }

 

  sqliteDataContext

 

  如果看了上面的Code,会发现查询表数据方法是使用的linq。这种方式相比遍历IDataReader要高效得多。只是目前.NET只支持查询,如果想要实现增删改需要第三方库支持。常见的有Dblinq 、linqconnect、linq2db和ado.net sqlite data provIDer等。不过使用事务批量插入数据也非常的快。

 

写在后面

  sqlite作为一款轻型高效的嵌入式数据库,适合简单高性能低并发的应用,在移动端使用将会是广泛的,如果是高通信量的Web站点,sqlite是不合适的。

  据@InkFx指出,也看了一些大数据案例,证实sqlite对高负载支持也很好(未亲自测试)。当然,这种高负载也会受制于运行时的文件系统。

  

总结

以上是内存溢出为你收集整理的C# 中 SQLite 使用介绍全部内容,希望文章能够帮你解决C# 中 SQLite 使用介绍所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212891.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存