System.Data.SQLite数据库介绍51CTO博客 - 凯时娱乐

System.Data.SQLite数据库介绍51CTO博客

2019年03月09日13时07分40秒 | 作者: 曜灿 | 标签: 数据库,数据,一个 | 浏览: 1462

SQLite介绍
在介绍System.Data.SQLite之前需求介绍一下SQLite,SQLite是一个类似于Access的单机版数据库办理体系,它将一切数据库的界说(包括界说、表、索引和数据自身)都保存在一个单一的文件中。并且,SQLite是一个用C完结的类库,它在内存耗费、文件体积、简略性方面都有不错的体现,假如数据在10W条以下,查询速度也是适当快的。
SQLite具有以下特征:
完结大都SQL92的规范,包括业务(原子性、一致性、阻隔性和持久性)、触发器和大大都的杂乱查询。
不对刺进或许更新的数据进行类型检查,你能够将字符串刺进到整数列中(这个或许让有些用户不太习惯)。
支撑Windows/Linux/Unix等干流体系,还支撑嵌入式体系如Android或Windows Mobile。
System.Data.SQLite
System.Data.SQLite是SQLite的加强版,它能够无需.NET Framework支撑,由于它内部包括了一个ADO.NET 2.0引擎,所以.NET开发人员能够运用System.Data.SQLite便利地开发.NET程序。
System.Data.SQLite及SQLite也有一些约束,比方不支撑行级及表级锁,当一个衔接断定数据库以用于写入数据,其它的数据库衔接只能等候那个衔接操作完结之后进行读写操作,SQLite.NET测验在超时期内屡次测验。
实践上关于大型的运用咱们都会挑选一些大型专业的数据库,System.Data.SQLite和SQLite适合于一些受限的场合,比方手机等。在这里我讲一个实在的阅历,在此前我从前做过一个小型体系,要剖析三个Excel文件,其间两个的记载大约在400条左右,而别的一个大约是1万条左右,关于这么一个体系假如运用数据库,即便单机版的Access,导入之后运用数据库的特性进行剖析,将是一个相对较为简略的工作,由于咱们能够在数据库里运用衔接查询,还能够对记载运用数据库函数,可是对方供给的信息是布置的机器上虽然装置了Office,可是仅仅装置了Word、Excel和Outlook,而没有Access,对方也不期望装置其它的软件,由于我也不能断定没有装置Access的机器上是否能经过OleDB拜访.mdb文件,所以没有办法,只要才有内存表的方式,行将Excel中的数据读取到DataTable中,然后对三个DataTable进行剖析,虽然做了许多优化,可是功率依然不是太抱负。关于这种状况,假如我其时知道System.Data.SQLite就好办多了,将三个Excel中的数据导入到System.Data.SQLite中,然后运用System.Data.SQLite供给的函数处理起来是适当省劲和便利的。关于System.Data.SQLite来说,布置时不需求装置,仅需求一个System.Data.SQLite.dll就够了,这个dll仅866K!并且它不需求像运用Com组件那样需求注册。
在VS2008中操作System.Data.SQLite
为了便利开发者,System.Data.SQLite供给了VS2005和VS2008的支撑,乃至还支撑.NET 3.5 SP1中的Entity Framework,下面是在VS2008中运用System.Data.SQLite规划器的状况:
首要翻开VS2008中的服务器资源办理器,如下图:
 
接着在数据衔接上点击鼠标右键,如下图所示:
 
然后挑选“增加衔接”,如下图所示:
 
这时分挑选System.Data.SQLite运用的数据库文件,文件后缀默许是.db3,还能够点击下方的“测验衔接”按钮,假如没有问题就会弹出正确的对话框,点击“断定”按钮之后在服务器资源办理器中就会呈现如下的状况:
 
这样咱们就能够像操作SQL Server中的库相同操作System.Data.SQLite中的表了。
System.Data.SQLite数据库通用类
针对对数据库的操作状况,分为以下几种状况:
创立数据库文件;
回来DataTable;
回来DataReader;
履行增修改,回来受影响的行数;
履行查询,回来榜首行榜首列(一般用于带有行函数的查询,如SUM/AVG/COUNT等);
回来库中一切的表;
由于在System.Data.SQLite中不存在存储进程,所以一切的操作都是根据文本的SQL句子,为了防止SQL注入,所以运用了参数化的SQL句子,这个数据库通用类如下:
  1. using System;  
  2. using System.Data;  
  3. using System.Data.Common;  
  4. using System.Collections.Generic;  
  5. using System.Data.SQLite;  
  6. using System.Reflection;  
  7. using System.Collections;     
  8.  
  9. namespace GetTime  
  10. {  
  11.     public class SQLiteDBHelper  
  12.     {  
  13.         private string connectionString = string.Empty;  
  14.  
  15.         static SQLiteDBHelper()  
  16.         {  
  17.               
  18.         }  
  19.         /// <summary>     
  20.         /// 结构函数     
  21.         /// </summary>     
  22.         /// <param name="dbPath">SQLite数据库文件途径</param>     
  23.         public SQLiteDBHelper(string dbPath)  
  24.         {  
  25.             this.connectionString = "Data Source=" + dbPath;  
  26.         }  
  27.         /// <summary>     
  28.         /// 创立SQLite数据库文件     
  29.         /// </summary>     
  30.         /// <param name="dbPath">要创立的SQLite数据库文件途径</param>     
  31.         public static void CreateDB(string dbPath)  
  32.         {  
  33.             using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbPath))  
  34.             {  
  35.                 connection.Open();  
  36.                 using (SQLiteCommand command = new SQLiteCommand(connection))  
  37.                 {  
  38.                     command.CommandText = "CREATE TABLE Demo(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)";  
  39.                     command.ExecuteNonQuery();  
  40.  
  41.                     command.CommandText = "DROP TABLE Demo";  
  42.                     command.ExecuteNonQuery();  
  43.                 }  
  44.             }  
  45.         }  
  46.         /// <summary>     
  47.         /// 对SQLite数据库履行增修改操作,回来受影响的行数。     
  48.         /// </summary>     
  49.         /// <param name="sql">要履行的增修改的SQL句子</param>     
  50.         /// <param name="parameters">履行增修改句子所需求的参数,参数有必要以它们在SQL句子中的次序为准</param>     
  51.         /// <returns></returns>     
  52.         public int ExecuteNonQuery(string sql, IList<SQLiteParameter> parameters)  
  53.         {  
  54.             int affectedRows = 0;  
  55.             using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
  56.             {  
  57.                 connection.Open();  
  58.                 using (DbTransaction transaction = connection.BeginTransaction())  
  59.                 {  
  60.                     using (SQLiteCommand command = new SQLiteCommand(connection))  
  61.                     {  
  62.                         command.CommandText = sql;  
  63.                         if (!(parameters  null || parameters.Count  0))  
  64.                         {  
  65.                             foreach (SQLiteParameter parameter in parameters)  
  66.                             {  
  67.                                 command.Parameters.Add(parameter);  
  68.                             }  
  69.                         }  
  70.                         affectedRows = command.ExecuteNonQuery();  
  71.                     }  
  72.                     transaction.Commit();  
  73.                 }  
  74.             }  
  75.             return affectedRows;  
  76.         }  
  77.         /// <summary>     
  78.         /// 履行一个查询句子,回来一个相关的SQLiteDataReader实例     
  79.         /// </summary>     
  80.         /// <param name="sql">要履行的查询句子</param>     
  81.         /// <param name="parameters">履行SQL查询句子所需求的参数,参数有必要以它们在SQL句子中的次序为准</param>     
  82.         /// <returns></returns>     
  83.         public SQLiteDataReader ExecuteReader(string sql, IList<SQLiteParameter> parameters)  
  84.         {  
  85.             SQLiteConnection connection = new SQLiteConnection(connectionString);  
  86.             SQLiteCommand command = new SQLiteCommand(sql, connection);  
  87.             if (!(parameters  null || parameters.Count  0))  
  88.             {  
  89.                 foreach (SQLiteParameter parameter in parameters)  
  90.                 {  
  91.                     command.Parameters.Add(parameter);  
  92.                 }  
  93.             }  
  94.             connection.Open();  
  95.             return command.ExecuteReader(CommandBehavior.CloseConnection);  
  96.         }  
  97.         /// <summary>     
  98.         /// 履行一个查询句子,回来一个包括查询成果的DataTable     
  99.         /// </summary>     
  100.         /// <param name="sql">要履行的查询句子</param>     
  101.         /// <param name="parameters">履行SQL查询句子所需求的参数,参数有必要以它们在SQL句子中的次序为准</param>     
  102.         /// <returns></returns>     
  103.         public DataTable ExecuteDataTable(string sql, IList<SQLiteParameter> parameters)  
  104.         {  
  105.             using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
  106.             {  
  107.                 using (SQLiteCommand command = new SQLiteCommand(sql, connection))  
  108.                 {  
  109.                     if (!(parameters  null || parameters.Count  0))  
  110.                     {  
  111.                         foreach (SQLiteParameter parameter in parameters)  
  112.                         {  
  113.                             command.Parameters.Add(parameter);  
  114.                         }  
  115.                     }  
  116.                     SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);  
  117.                     DataTable data = new DataTable();  
  118.                     adapter.Fill(data);  
  119.                     return data;  
  120.                 }  
  121.             }  
  122.  
  123.         }  
  124.         /// <summary>     
  125.         /// 履行一个查询句子,回来查询成果的榜首行榜首列     
  126.         /// </summary>     
  127.         /// <param name="sql">要履行的查询句子</param>     
  128.         /// <param name="parameters">履行SQL查询句子所需求的参数,参数有必要以它们在SQL句子中的次序为准</param>     
  129.         /// <returns></returns>     
  130.         public Object ExecuteScalar(string sql, IList<SQLiteParameter> parameters)  
  131.         {  
  132.             using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
  133.             {  
  134.                 using (SQLiteCommand command = new SQLiteCommand(sql, connection))  
  135.                 {  
  136.                     if (!(parameters  null || parameters.Count  0))  
  137.                     {  
  138.                         foreach (SQLiteParameter parameter in parameters)  
  139.                         {  
  140.                             command.Parameters.Add(parameter);  
  141.                         }  
  142.                     }  
  143.                     return command.ExecuteScalar();  
  144.                 }  
  145.             }  
  146.         }  
  147.  
  148.         /// <summary>     
  149.         /// 查询数据库中的一切数据类型信息     
  150.         /// </summary>     
  151.         /// <returns></returns>     
  152.         public DataTable GetSchema()  
  153.         {  
  154.             using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
  155.             {  
  156.                 connection.Open();  
  157.                 DataTable data = connection.GetSchema("TABLES");  
  158.                 connection.Close();  
  159.                 //foreach (DataColumn column in data.Columns)     
  160.                 //{     
  161.                 //    Console.WriteLine(column.ColumnName);     
  162.                 //}     
  163.                 return data;  
  164.             }  
  165.         }  
  166.           
  167.     }  
(注:上面的代码在2011-07-15日代码从头修改了,参数由SQLiteParameter[] parameters变为IList<SQLiteParameter> parameters,运用范围更广)。
System.Data.SQLite数据库通用类的用法
下面演示一下刚刚编写的数据库通用类的用法,代码如下: using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using SQLiteQueryBrowser;
namespace SQLiteDemo
{
        class Program
        {
                static void Main(string[] args)
                {
                        //CreateTable();
                        //InsertData();
                        ShowData();
                        Console.ReadLine();
                }
                public static void CreateTable()
                {
                        string dbPath = "D:\\Demo.db3";
                        //假如不存在改数据库文件,则创立该数据库文件
                        if (!System.IO.File.Exists(dbPath))
                        {
                                SQLiteDBHelper.CreateDB("D:\\Demo.db3");
                        }
                        SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3");
                        string sql = "CREATE TABLE Test3(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,Name char(3),TypeName varchar(50),addDate datetime,UpdateTime Date,Time time,Comments blob)";
                        db.ExecuteNonQuery(sql, null);
                }
                public static void InsertData()
                {
                        string sql = "INSERT INTO Test3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)";
                        SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3");
                        for (char c = A; c <= Z; c++)
                        {
                                for (int i = 0; i < 100; i++)
                                {
                                        SQLiteParameter[] parameters = new SQLiteParameter[]{
                                                new SQLiteParameter("@Name",c+i.ToString()),
                                        new SQLiteParameter("@TypeName",c.ToString()),
                                        new SQLiteParameter("@addDate",DateTime.Now),
                                        new SQLiteParameter("@UpdateTime",DateTime.Now.Date),
                                        new SQLiteParameter("@Time",DateTime.Now.ToShortTimeString()),
                                        new SQLiteParameter("@Comments","Just a Test"+i)
                                        };
                                        db.ExecuteNonQuery(sql, parameters);
                                }
                        }
                }
                public static void ShowData()
                {
                        //查询从50条起的20条记载
                        string sql = "select * from test3 order by id desc limit 50 offset 20";
                        SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3");
                        using (SQLiteDataReader reader = db.ExecuteReader(sql, null))
                        {
                                while (reader.Read())
                                {
                                        Console.WriteLine("ID:{0},TypeName{1}", reader.GetInt64(0), reader.GetString(1));
                                }
                        }
                }

        }
}
在实践状况中,选用通用类大批量刺进数据会有些慢,这是由于在System.Data.SQLite中的操作假如没有指定操作,则会被作为一个事物,假如需求一次性写入许多记载,则主张显式创立一个事物,在这个业务中完结一切的操作比较好,这样的话比每次操作创立一个事物的功率要提高许多。
终究运用VS2008供给的功用,能够看到里边的数据如下:
 
需求阐明的是在System.Data.SQLite中数据类型的规则不适很严厉,从创立Test3表的SQL句子来看,表中addDate、UpdateTime、Time分别是DateTime、Date、Time类型字段,但实践上咱们刺进的时分没有依照这个规则,终究显现的成果也是尽量遵从数据库字段的界说。
总结
System.Data.SQLite确实是一个十分细巧精悍的数据库,作为对SQLite的封装(SQLite能够在Android等类型的手机上运用Java拜访),它依然是体较小,同比功能高、内存耗费小、无需装置仅需一个dll就能够运转的长处(假如在Mobile手机上则需求两个文件),仅有的一个缺陷是没有比较的GUI(图形用户界面),不过正由于如此它才得以体积小。
在实践开发中没有图形用户界面或许有些不方便,咱们能够运用VS来检查和操作数据,我自己也做了一个小东东,便于办理和保护数据,界面如下:
 
假如你要开发数据量在10万条以下的运用,我主张你测验运用一下System.Data.SQLite,它或许是一个不错的挑选。
周公
2010-04-01
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章