zoukankan      html  css  js  c++  java
  • System.Data.SQLite数据库介绍

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhoufoxcn.blog.51cto.com/792419/292670
    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语句,这个数据库通用类如下:
    using System; 
    using System.Data; 
    using System.Data.Common; 
    using System.Data.SQLite; 
    namespace SQLiteQueryBrowser 

            /// <summary> 
            /// 说明:这是一个针对System.Data.SQLite的数据库常规操作封装的通用类。 
            /// 作者:zhoufoxcn(周公) 
            /// 日期:2010-04-01 
            /// Blog:http://zhoufoxcn.blog.51cto.com or http://blog.csdn.net/zhoufoxcn 
            /// Version:0.1 
            /// </summary> 
            public class SQLiteDBHelper 
            { 
                    private string connectionString = string.Empty; 
                    /// <summary> 
                    /// 构造函数 
                    /// </summary> 
                    /// <param name="dbPath">SQLite数据库文件路径</param> 
                    public SQLiteDBHelper(string dbPath) 
                    { 
                            this.connectionString = "Data Source=" + dbPath; 
                    } 
                    /// <summary> 
                    /// 创建SQLite数据库文件 
                    /// </summary> 
                    /// <param name="dbPath">要创建的SQLite数据库文件路径</param> 
                    public static void CreateDB(string dbPath) 
                    { 
                            using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbPath)) 
                            { 
                                    connection.Open(); 
                                    using (SQLiteCommand command = new SQLiteCommand(connection)) 
                                    { 
                                            command.CommandText = "CREATE TABLE Demo(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)"
                                            command.ExecuteNonQuery(); 
                                            command.CommandText = "DROP TABLE Demo"
                                            command.ExecuteNonQuery(); 
                                    } 
                            } 
                    } 
                    /// <summary> 
                    /// 对SQLite数据库执行增删改操作,返回受影响的行数。 
                    /// </summary> 
                    /// <param name="sql">要执行的增删改的SQL语句</param> 
                    /// <param name="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 
                    /// <returns></returns> 
                    public int ExecuteNonQuery(string sql, SQLiteParameter[] parameters) 
                    { 
                            int affectedRows = 0; 
                            using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
                            { 
                                    connection.Open(); 
                                    using (DbTransaction transaction = connection.BeginTransaction()) 
                                    { 
                                            using (SQLiteCommand command = new SQLiteCommand(connection)) 
                                            { 
                                                    command.CommandText = sql; 
                                                    if (parameters != null
                                                    { 
                                                            command.Parameters.AddRange(parameters); 
                                                    } 
                                                    affectedRows = command.ExecuteNonQuery(); 
                                            } 
                                            transaction.Commit(); 
                                    } 
                            } 
                            return affectedRows; 
                    } 
                    /// <summary> 
                    /// 执行一个查询语句,返回一个关联的SQLiteDataReader实例 
                    /// </summary> 
                    /// <param name="sql">要执行的查询语句</param> 
                    /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 
                    /// <returns></returns> 
                    public SQLiteDataReader ExecuteReader(string sql, SQLiteParameter[] parameters) 
                    { 
                            SQLiteConnection connection = new SQLiteConnection(connectionString); 
                            SQLiteCommand command = new SQLiteCommand(sql, connection); 
                            if (parameters != null
                            { 
                                    command.Parameters.AddRange(parameters); 
                            } 
                            connection.Open(); 
                            return command.ExecuteReader(CommandBehavior.CloseConnection); 
                    } 
                    /// <summary> 
                    /// 执行一个查询语句,返回一个包含查询结果的DataTable 
                    /// </summary> 
                    /// <param name="sql">要执行的查询语句</param> 
                    /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 
                    /// <returns></returns> 
                    public DataTable ExecuteDataTable(string sql, SQLiteParameter[] parameters) 
                    { 
                            using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
                            { 
                                    using (SQLiteCommand command = new SQLiteCommand(sql, connection)) 
                                    { 
                                            if (parameters != null
                                            { 
                                                    command.Parameters.AddRange(parameters); 
                                            } 
                                            SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); 
                                            DataTable data = new DataTable(); 
                                            adapter.Fill(data); 
                                            return data; 
                                    } 
                            } 
                             
                    } 
                    /// <summary> 
                    /// 执行一个查询语句,返回查询结果的第一行第一列 
                    /// </summary> 
                    /// <param name="sql">要执行的查询语句</param> 
                    /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 
                    /// <returns></returns> 
                    public Object ExecuteScalar(string sql, SQLiteParameter[] parameters) 
                    { 
                            using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
                            { 
                                    using (SQLiteCommand command = new SQLiteCommand(sql, connection)) 
                                    { 
                                            if (parameters != null
                                            { 
                                                    command.Parameters.AddRange(parameters); 
                                            } 
                                            SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); 
                                            DataTable data = new DataTable(); 
                                            adapter.Fill(data); 
                                            return data; 
                                    } 
                            } 
                    } 
                    /// <summary> 
                    /// 查询数据库中的所有数据类型信息 
                    /// </summary> 
                    /// <returns></returns> 
                    public DataTable GetSchema() 
                    { 
                            using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 
                            { 
                                    connection.Open(); 
                                    DataTable data=connection.GetSchema("TABLES"); 
                                    connection.Close(); 
                                    //foreach (DataColumn column in data.Columns) 
                                    //{ 
                                    //        Console.WriteLine(column.ColumnName); 
                                    //} 
                                    return data; 
                            } 
                    } 
            } 
    }

    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
  • 相关阅读:
    suse12安装详解
    Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
    菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
    openstack中dashboard页面RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
    Multiple network matches found for name 'selfservice', use an ID to be more specific.报错
    查看 SELinux状态及关闭SELinux
    SELinux深入理解
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址
    Oracle job procedure 存储过程定时任务
    POI文件导出至EXCEL,并弹出下载框
  • 原文地址:https://www.cnblogs.com/fslnet/p/1762421.html
Copyright © 2011-2022 走看看