澳门威利斯人_威利斯人娱乐「手机版」

来自 网络资讯 2019-06-01 08:00 的文章
当前位置: 澳门威利斯人 > 网络资讯 > 正文

使用介绍,SQLite执行效率优化结论

关于SQLite

一、如要使用SQLite,能够从Visual Studio中的“程序包管理器调控台”输入以下命令完成安装:

关于SQLite

         SQLite是一款轻型的嵌入式的遵循ACID的关系型数据库管理种类,诞生已有一陆个年头了。随着移动互联的上扬,未来得到了更广大的应用。

在行使SQLite此前,我们必然要先精晓它有个别“本性”的地点。上边是它的一些特色:

一、  自包括。SQLite相当的大层度上是单独的,他只须要特别小的外表库扶助。任何程序能够访问磁盘就足以采用SQLite数据库。那使它适用于嵌入式设备,缺少桌面计算机辅助的底子设备。那也使得SQLite适用于不作任何改作育可运转在分化配置计算机上的程序。

二、  无服务器。大好多SQL数据库引擎被达成为贰个独门的服务器进程。程序要访问数据库与服务器通讯使用某种方式的进度间通讯(经常是TCP / IP),向服务器发送请求并选取重回结果。SQLite则不是这种专门的学问章程。对于SQLite,想要访问数据库直接从磁盘上的对数据库文件实施读和写操作。未有中间的服务器进度。

三、  零配置。使用SQLite没有须求“安装”。未有“设置”程序。未有服务器进度需求运营,截止,或安排。无需管理员来创立2个新的数据库实例或访问权限分配给用户。SQLite不应用陈设文件。

四、  协理职业。事务数据库的具有改造和询问表现出原子性、一致性、隔断性、悠久性(ACID)。奉行SQLite的作业操作时,要么完全实行,要么不实施,固然写入磁盘的操作被先后崩溃,断电等故障打断。

五、  开源。和前边的特点相比较,这么些就像从未多大关系。之所以把它看作七个表征,是因为开源在比较大层度上会成为大家挑选四个消除方案的关键维度。

 

  除了那个,SQLite还会有着比同是开源的Mysql、PostgreSQL数据库越来越快的拍卖作用,更低的能源占用。看起来很“完美”的东西背后往往也享有致命的缺陷。SQLite的短处虽不可能说致命,但也得以令你在接纳的进程中说NO。如若你供给更加精准的决定数据库访问,细粒度锁(SQLite只提供数据库级的锁定)以及很好的并发性(就算能够手动完结产出,可是品质不高,也便于并发死锁),SQLite或然不符合你。其它,SQLite也不吻合长途访问,尽管能够经过网络共享的措施运营,然则会存在文件锁定的主题材料,而且访问互联网共享相关的推移会导致质量的狂跌。

 

SQLite是1款轻型的嵌入式的服从ACID的关系型数据库管理连串,诞生已有一四个新禧了。随着活动互联的腾飞,现在获得了更常见的应用。

PM> Install-Package System.Data.SQLite.Core

设置配备

         前边说过了,使用SQLite是最棒简单的,无需安装,只要求在官网下载库文件增多引用就能够。当然,还可能有比很粗略的片段陈设。还应该有更轻巧的措施,使用Nuget增多SQLite库文件并机关配置,那几乎是壹键解决啊。

率先,在Nuget中找到SQLite。这里咱们挑选第二个安装。

 图片 1

 

  会自动安装如下库。

 图片 2

 

  安装后会自动抬高如下库的引用。

图片 3

 

  并自动抬高如下配置。

 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   </configSections>
 9   
10   <entityFramework>
11     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
12       <parameters>
13         <parameter value="v11.0"/>
14       </parameters>
15     </defaultConnectionFactory>
16     <providers>
17       <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
18       <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
19     </providers>
20   </entityFramework>
21 <system.data>
22     <DbProviderFactories>
23     <remove invariant="System.Data.SQLite.EF6"/><add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6"
24         description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6"/></DbProviderFactories>
25   </system.data></configuration>

 

在采纳SQLite以前,大家终将在先通晓它有些“本性”的地点。上边是它的壹部分表征:

SQLite则会安装到项目中,扶助三11位或6三人,如下图所示:

SQLite的使用 

         上边的预备干活早已就绪。接下来起先利用SQLite。这里不对怎么样创立数据库作介绍,在实质上中国人民解放军海军事工业程高校业作中,作者一般会选择使用Navicat for SQLite来成立数据库,方便飞速。如若有编码成立数据库供给,自行问度娘。假若要运用Linq,别忘了加多System.Data.Linq的引用。

图片 4图片 5

  1     /// <summary>
  2     /// SQLite数据库帮助类
  3     /// </summary>
  4     public class SQLiteHelper
  5     {
  6         /// <summary>
  7         /// 数据库路径
  8         /// </summary>
  9         private static readonly string m_DataSource = ConfigurationManager.AppSettings["Test"];
 10 
 11         /// <summary>
 12         /// ConnectionString样例:Data Source=Test.db;Pooling=true;FailIfMissing=false
 13         /// </summary>
 14         private static readonly string m_ConnectionString;
 15 
 16         /// <summary>
 17         /// 静态构造函数,初始化连接字符串,检查数据库连接
 18         /// </summary>
 19         static SQLiteHelper()
 20         {
 21             try
 22             {
 23                 SQLiteConnectionStringBuilder connectionStringBuilder = new SQLiteConnectionStringBuilder
 24                 {
 25                     Version = 3,
 26                     Pooling = true,
 27                     FailIfMissing = false,
 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         /// <summary>
 42         /// 获得连接对象
 43         /// </summary>
 44         /// <returns></returns>
 45         private static SQLiteConnection GetSQLiteConnection()
 46         {
 47             return new SQLiteConnection(m_ConnectionString);
 48         }
 49 
 50         /// <summary>
 51         /// 预备命令
 52         /// </summary>
 53         /// <param name="cmd"></param>
 54         /// <param name="conn"></param>
 55         /// <param name="cmdText"></param>
 56         /// <param name="commandParameters"></param>
 57         private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, 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         /// <summary>
 77         /// 返回受影响的行数
 78         /// </summary>
 79         /// <param name="cmdText">执行语句</param>
 80         /// <param name="commandParameters">传入的参数</param>
 81         /// <returns>返回受影响行数</returns>
 82         public static int ExecuteNonQuery(string cmdText, params object[] commandParameters)
 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         /// <summary>
 93         /// 返回表集合
 94         /// </summary>
 95         /// <param name="cmdText">执行语句</param>
 96         /// <param name="commandParameters">传入的参数</param>
 97         /// <returns>返回DataSet</returns>
 98         public static DataSet ExecuteDataset(string cmdText, params object[] commandParameters)
 99         {
100             DataSet ds = new DataSet();
101             SQLiteCommand command = new SQLiteCommand();
102             using (SQLiteConnection connection = GetSQLiteConnection())
103             {
104                 PrepareCommand(command, connection, cmdText, commandParameters);
105                 SQLiteDataAdapter da = new SQLiteDataAdapter(command);
106                 da.Fill(ds);
107             }
108             return ds;
109         }
110 
111         /// <summary>
112         /// 返回SqlDataReader对象
113         /// </summary>
114         /// <param name="cmdText">执行语句</param>
115         /// <param name="commandParameters">传入的参数</param>
116         /// <returns>返回SQLiteDataReader</returns>
117         public static SQLiteDataReader ExecuteReader(string cmdText, params object[] commandParameters)
118         {
119             SQLiteCommand command = new SQLiteCommand();
120             SQLiteConnection connection = GetSQLiteConnection();
121             try
122             {
123                 PrepareCommand(command, connection, cmdText, commandParameters);
124                 SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
125                 return reader;
126             }
127             catch
128             {
129                 connection.Close();
130                 throw;
131             }
132         }
133 
134         /// <summary>
135         /// 返回表第一行
136         /// </summary>
137         /// <param name="cmdText">执行语句</param>
138         /// <param name="commandParameters">传入的参数</param>
139         /// <returns>返回:第一行</returns>
140         public static DataRow ExecuteDataRow(string cmdText, params object[] commandParameters)
141         {
142             DataSet ds = ExecuteDataset(cmdText, commandParameters);
143             if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
144                 return ds.Tables[0].Rows[0];
145             return null;
146         }
147 
148         /// <summary>
149         /// 返回结果集中的第一行第一列,忽略其他行或列
150         /// </summary>
151         /// <param name="cmdText">执行语句</param>
152         /// <param name="commandParameters">传入的参数</param>
153         /// <returns>返回:第一行第一列</returns>
154         public static object ExecuteScalar(string cmdText, params object[] commandParameters)
155         {
156             SQLiteCommand cmd = new SQLiteCommand();
157             using (SQLiteConnection connection = GetSQLiteConnection())
158             {
159                 PrepareCommand(cmd, connection, cmdText, commandParameters);
160                 return cmd.ExecuteScalar();
161             }
162         }
163 
164         #endregion
165 
166 
167         #region advanced method
168 
169         /// <summary>
170         /// 获取表所有数据
171         /// </summary>
172         /// <typeparam name="T">实体类型</typeparam>
173         /// <param name="tableName">表名</param>
174         /// <returns>表所有数据</returns>
175         public static List<T> GetTableData<T>(string tableName) where T : class
176         {
177             List<T> dataList = new List<T>();
178             try
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             catch { }
188             return dataList;
189         }
190 
191         /// <summary>
192         /// 获取表数据
193         /// </summary>
194         /// <typeparam name="T">实体类型</typeparam>
195         /// <param name="cmdText">sql语句</param>
196         /// <param name="parameter">参数</param>
197         /// <returns>表所有数据</returns>
198         public static List<T> GetTableData<T>(string cmdText, params object[] parameter) where T : class
199         {
200             List<T> dataList = new List<T>();
201             try
202             {
203                 using (SqliteDataContext context = new SqliteDataContext(new SQLiteConnection(m_ConnectionString)))
204                 {
205                     dataList = context.ExecuteQuery<T>(cmdText, parameter).ToList();
206                 }
207             }
208             catch {}
209             return dataList;
210         }
211 
212         /// <summary>
213         /// 插入表数据
214         /// </summary>
215         /// <typeparam name="T">数据类型</typeparam>
216         /// <param name="tableName">表名</param>
217         /// <param name="dataList">数据集合</param>
218         /// <returns>true或false</returns>
219         public static bool BatchInsert<T>(string tableName, List<T> dataList)
220         {
221             try
222             {
223                 if (dataList != null && dataList.Count > 0)
224                 {
225                     var temp = dataList[0];
226                     PropertyInfo[] propertyInfos = temp.GetType().GetProperties();
227                     List<string> propertyStrs = new List<string>();
228                     string propertyStr = "";
229                     foreach (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                     using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
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                                 foreach (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, null));
251                                     }
252                                     command.ExecuteNonQuery();
253                                 }
254                                 transaction.Commit();
255                             }
256                         }
257                     }
258                 }
259             }
260             catch (Exception ex)
261             {
262                 return false;
263             }
264             return true;
265         }
266 
267         /// <summary>
268         /// 删除表数据
269         /// </summary>
270         /// <param name="tableName">表名</param>
271         /// <returns>true或false</returns>
272         public static bool DeleteTableData(string tableName)
273         {
274             try
275             {
276                 using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
277                 {
278                     using (SQLiteCommand command = new SQLiteCommand(conn))
279                     {
280                         command.Connection.Open();
281                         command.CommandText = "delete from "   tableName;
282                         command.ExecuteNonQuery();
283                     }
284                 }
285             }
286             catch (Exception ex)
287             {
288                 return false;
289             }
290             return true;
291         }
292 
293         #endregion
294     }

SQLiteHelper

 

图片 6图片 7

 1     /// <summary>
 2     /// Linq to SQLite
 3     /// </summary>
 4     public class SQLiteDataContext : DataContext
 5     {
 6         public SQLiteDataContext(string connection, MappingSource mappingSource) :
 7             base(connection, mappingSource)
 8         {
 9         }
10         public SQLiteDataContext(IDbConnection connection, MappingSource mappingSource) :
11             base(connection, mappingSource)
12         {
13         }
14         public SQLiteDataContext(string connectionString) :
15             base(new SQLiteConnection(connectionString))
16         {
17         }
18         public SQLiteDataContext(IDbConnection connection) :
19             base(connection)
20         {
21         }
22     }

SQLiteDataContext

 

  要是看了地点的Code,会发觉查询表数据格局是利用的Linq。这种艺术对待遍历IDataReader要快快得多。只是最近.NET只补协助调查询,如若想要完毕增加和删除改要求第一方库辅助。常见的有Dblinq 、linqconnect、linq2db和ado.net sqlite data provider等。然则使用专门的学业批量插入数据也极度的快。

 

一、 自蕴涵。SQLite非常大层度上是单身的,他只供给丰盛小的外表库帮忙。任何程序能够访问磁盘就足以应用SQLite数据库。那使它适用于嵌入式设备,紧缺桌面Computer支持的根底设备。那也使得SQLite适用于不作任何改换就可运转在区别配置Computer上的程序。

图片 8

写在背后

  SQLite作为1款轻型高效的嵌入式数据库,适合轻便高品质低产出的施用,在运动端选用将会是常见的,倘若是MediaTek信量的Web站点,SQLite是不稳妥的。

  据@InkFx提议,也看了一些大数据案例,证实SQLite对高负荷帮衬也很好(未亲自测试)。当然,这种高负载也会受制于运转时的文件系统。

  

 

 

 

扩大阅读:

二、 无服务器。大大多SQL数据库引擎被完毕为贰个独门的服务器进度。程序要访问数据库与服务器通讯使用某种格局的进度间通讯(日常是TCP / IP),向服务器发送请求并接收再次回到结果。SQLite则不是这种工作措施。对于SQLite,想要访问数据库直接从磁盘上的对数据库文件实践读和写操作。未有中间的服务器进度。

图片 9

叁、 零配置。使用SQLite无需“安装”。未有“设置”程序。未有服务器进度供给运行,甘休,或配备。无需管理员来创设二个新的数据库实例或访问权限分配给用户。SQLite不使用布署文件。

贰、新建四个SQLite数据库,名称命名字为Test.db,其表名称及列定义如下:

四、 帮助专门的工作。事务数据库的装有退换和查询表现出原子性、①致性、隔绝性、长久性(ACID)。试行SQLite的职业操作时,要么完全试行,要么不奉行,即便写入磁盘的操作被先后崩溃,断电等故障打断。

图片 10

伍、 开源。和前面包车型地铁特征比较,这一个就像从未多大关系。之所以把它作为三个脾气,是因为开源在十分大层度上会成为大家采用三个消除方案的要紧维度。

三、新建二个调节台应用的缓慢解决方案,并输入以下代码,看看SQLite的实践时间:

本文首要介绍的是关于C# SQLite试行功效优化的连带内容,分享出来供大家参谋学习,下边话非常的少说了,来1块看看详细的介绍吧

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Diagnostics;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            SQLiteConnection connection = Run(() => new SQLiteConnection("Data Source = Test.db"), "连接对象初始化");
            Run(() => connection.Open(), "打开连接");
            SQLiteCommand command = Run(() => new SQLiteCommand(connection), "命令对象初始化");
            Run(() =>
            {
                command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";
                command.ExecuteNonQuery();
            }, "执行DELETE命令及收缩数据库");
            Run(() =>
            {
                for (int i = 0; i < 3000; i  )
                {
                    command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:000}','{i}')";
                    command.ExecuteNonQuery();
                }
                command.ExecuteScalar();
            }, "[---使用事务---]事务执行INSERT命令");
            List<Test> list1 = Run(() =>
            {
                command.CommandText = $"SELECT * FROM Info";
                List<Test> tests = new List<Test>();
                SQLiteDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Test t = new Test
                    {
                        ID = (long)reader[0],
                        Name = (string)reader[1],
                        Age = (long)reader[2]
                    };
                    tests.Add(t);
                }
                reader.Close();
                return tests;
            }, "[---不使用事务---]使用ExecuteReader方式执行SELECT命令");
            DataTable table1 = Run(() =>
            {
                command.CommandText = $"SELECT * FROM Info";
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
                DataTable _table = new DataTable();
                adapter.Fill(_table);
                return _table;
            }, "[---不使用事务---]使用Fill Table方式执行SELECT命令");

            Run(() =>
            {
                command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";
                command.ExecuteNonQuery();
            }, "执行DELETE命令及收缩数据库");
            SQLiteTransaction transaction = Run(() => connection.BeginTransaction(), "开始事务");
            Run(() => 
            {
                for (int i = 0; i < 3000; i  )
                {
                    command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:000}','{i}')";
                    command.ExecuteNonQuery();
                }
                var result = command.ExecuteScalar();
            }, "[---使用事务---]执行INSERT命令");
            List<Test> list2 =  Run(() =>
            {
                command.CommandText = $"SELECT * FROM Info";
                List<Test> tests = new List<Test>();
                SQLiteDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Test t = new Test
                    {
                        ID = (long)reader[0],
                        Name = (string)reader[1],
                        Age = (long)reader[2]
                    };
                    tests.Add(t);
                }
                reader.Close();
                return tests;
            }, "[---使用事务---]使用ExecuteReader方式执行SELECT命令");
            DataTable table2 = Run(() =>
            {
                command.CommandText = $"SELECT * FROM Info";
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
                DataTable _table = new DataTable();
                adapter.Fill(_table);
                return _table;
            }, "[---使用事务---]使用Fill Table方式执行SELECT命令");
            Run(() => transaction.Commit(), "提交事务");
            Run(() => connection.Close(), "关闭连接");
            Console.ReadKey();
        }

        public static void Run(Action action,string description)
        {
            Stopwatch sw = Stopwatch.StartNew();
            action();
            Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms");
        }

        public static T Run<T>(Func<T> func, string description)
        {
            Stopwatch sw = Stopwatch.StartNew();
            T result = func();
            Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms");
            return result;
        }
    }

    class Test
    {
        public long ID { set; get; }
        public string Name { set; get; }
        public long Age { set; get; }
    }
}

1、如要使用SQLite,能够从Visual Studio中的“程序包管理器调控台”输入以下命令达成安装:

 程序运营结果如下:

PM> Install-Package System.Data.SQLite.Core

图片 11

本文由澳门威利斯人发布于网络资讯,转载请注明出处:使用介绍,SQLite执行效率优化结论

关键词: 澳门威利斯人 数据库 SQLite