C# SQLite库使用技巧

1、SQLite介绍

SQLite,是一款轻型的数据库,是遵守的ACID关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标嵌入式是的,而且已经在很多中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等。

SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.

SQLite是一个开源、免费的小型RDBMS(关系型数据库),能独立运行、无服务器、零配置、支持事物,用C实现,内存占用较小,支持绝大数的SQL92标准。

SQLite数据库官方主页:http://www.sqlite.org/index.html

2、C#下调用SQLite数据库

在NuGet程序包内,搜索System.Data.Sqlite,安装Sqlite类库

3、在C#程序内添加SqliteHelper

sqliteHelper中主要用到2个方法:

a、ExecuteNonQuery 执行Insert,Update、Delete、创建库等操作,返回值是数据库影响的行数

b、ExecuteDataSet执行Select操作,返回查询数据集

    public class SQLiteHelper
    {
        public static string ConnectionString = "Data Source =" + Environment.CurrentDirectory + @"\database.db" + ";Pooling = true; FailIfMissing = true";

        /// <summary>
        /// 执行数据库操作(新增、更新或删除)
        /// </summary>
        /// <param name="cmdstr">连接字符串</param>
        /// <param name="cmdParms">SqlCommand对象</param>
        /// <returns>受影响的行数</returns>
        public int ExecuteNonQuery(string cmdstr, params SQLiteParameter[] cmdParms)
        {
            int result = 0;
            using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
            {
                SQLiteTransaction trans = null;
                SQLiteCommand cmd = new SQLiteCommand(cmdstr);
                PrepareCommand(cmd, conn, ref trans, true, cmd.CommandType, cmd.CommandText, cmdParms);
                try
                {
                    result = cmd.ExecuteNonQuery();
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }
            }
            return result;
        }

        /// <summary>
        /// 预处理Command对象,数据库链接,事务,需要执行的对象,参数等的初始化
        /// </summary>
        /// <param name="cmd">Command对象</param>
        /// <param name="conn">Connection对象</param>
        /// <param name="trans">Transcation对象</param>
        /// <param name="useTrans">是否使用事务</param>
        /// <param name="cmdType">SQL字符串执行类型</param>
        /// <param name="cmdText">SQL Text</param>
        /// <param name="cmdParms">SQLiteParameters to use in the command</param>
        private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, ref SQLiteTransaction trans, bool useTrans, CommandType cmdType, string cmdText, params SQLiteParameter[] cmdParms)
        {
            try
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();

                cmd.Connection = conn;
                cmd.CommandText = cmdText;

                if (useTrans)
                {
                    trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                    cmd.Transaction = trans;
                }

                cmd.CommandType = cmdType;

                if (cmdParms != null)
                {
                    foreach (SQLiteParameter parm in cmdParms)
                        cmd.Parameters.Add(parm);
                }
            }
            catch
            {

            }
        }

        /// <summary>
        /// 数据库查询
        /// </summary>
        /// <param name="cmdstr">sql语句</param>
        /// <param name="tableName">表名</param>
        /// <returns>DataSet对象</returns>
        public DataSet ExecuteDataSet(string cmdstr)
        {
            DataSet ds = new DataSet();
            SQLiteConnection conn = new SQLiteConnection(ConnectionString);
            SQLiteTransaction trans = null;
            SQLiteCommand cmd = new SQLiteCommand(cmdstr);
            PrepareCommand(cmd, conn, ref trans, false, cmd.CommandType, cmd.CommandText);
            try
            {
                SQLiteDataAdapter sda = new SQLiteDataAdapter(cmd);
                sda.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (cmd.Connection != null)
                {
                    if (cmd.Connection.State == ConnectionState.Open)
                    {
                        cmd.Connection.Close();
                    }
                }
            }
            return ds;
        }

4、Sqlite部分技巧

a、SQLiteConnection类的CreateFile方法,在程序内动态创建数据库文件,通过下面的方法即可创建出Analysis.db名称的数据库

        /// <summary>
        /// 数据库路径
        /// </summary>
        private static string databasepath = AppDomain.CurrentDomain.BaseDirectory + "DataBase\\";
        /// <summary>
        /// 数据库名称
        /// </summary>
        private const string databasename = "Analysis.db";
        /// <summary>
        /// 创建数据库
        /// </summary>
        public static void CreateDataBase()
        {
            try
            {
                if (!File.Exists(databasepath + databasename))
                {
                    if (!Directory.Exists(databasepath))
                        Directory.CreateDirectory(databasepath);
                    SQLiteConnection.CreateFile(databasepath + databasename);
                    LogHelper.Info("创建数据库:" + databasename + "成功!");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Debug(ex);
            }
        }

b、在写入高频数据的时候,需要使用事务,如果反复进行(打开->插入>关闭)操作,sqlite效率1秒钟插入也就2条,使用程序进行插入就会发现输入的频率远低于获取到的数据,大量的数据被缓存到内存中,为了处理入库的速度慢,就要用到事务,事务流程:

①打开连接

②开始事务

③循环在内存中执行插入命令

④提交事务写入本地文件,如果出错回滚事务

⑤关闭连接

代码见下图,开始事务后通过SQLiteCommand的ExecuteNonQuery()方法进行内存提交

            using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand())
                {
                    DbTransaction trans = null;
                    try
                    {
                        cmd.Connection = conn;
                        conn.Open();
                        //开启事务
                        using (trans = conn.BeginTransaction())
                        {
                            while (_list.Count > 0)
                            {
                                GpsDataClass _gps = _list[0];
                                try
                                {
                                    if (_gps != null)
                                    {
                                        SQLiteHelper sh = new SQLiteHelper(cmd);
                                        var dic = new Dictionary<string, object>();
                                        dic["CarPlate"] = _gps.CarPlate;
                                        dic["CarIpAddress"] = _gps.CarIpAddress;
                                        dic["PosX1"] = _gps.PosX1;
                                        dic["PosY1"] = _gps.PosY1;
                                        dic["PosZ1"] = _gps.PosZ1;
                                        dic["Heading1"] = _gps.Heading1;
                                        dic["PosStatus1"] = _gps.PosStatus1;
                                        dic["NumF1"] = _gps.NumF1;
                                        dic["NumB1"] = _gps.NumB1;
                                        dic["PosX2"] = _gps.PosX2;
                                        dic["PosY2"] = _gps.PosY2;
                                        dic["PosZ2"] = _gps.PosZ2;
                                        dic["Heading2"] = _gps.Heading2;
                                        dic["PosStatus2"] = _gps.PosStatus2;
                                        dic["NumF2"] = _gps.NumF2;
                                        dic["NumB2"] = _gps.NumB2;
                                        dic["Speed"] = _gps.Speed;
                                        dic["Signal"] = _gps.Signal;
                                        dic["NowTime"] = _gps.NowTime;
                                        sh.Insert("GpsRecord", dic);
                                        _list.RemoveAt(0);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    LogHelper.Debug(ex);
                                }
                            }
                            trans.Commit();
                        }
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        LogHelper.Debug(ex);
                    }
                    conn.Close();
                }
            }

到此这篇关于C# SQLite库使用的文章就介绍到这了,更多相关C# SQLite库使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#中使用SQLite数据库的方法介绍

    [SQLite管理工具简介] 推荐以下2款: Navicat for SQLite:功能非常强大,几乎包含了数据库管理工具的所有必需功能,操作简单,容易上手.唯一的缺点是不能打开由System.Data.SQLite.dll加密过的数据库. Database.Net:台湾人用.net开发的全能数据库管理工具,可以管理多种数据库,包括MSSQL.MYSQL.IBM DB2.Oracle.Access.Excel.OleDb.Odbc等十多种数据库(或数据接口),功能没有Navicat那么多,只包含

  • C# SQLite数据库入门使用说明

    前言 我们在开发应用是经常会需要用到一些数据的存储,存储的方式有多种,使用数据库是一种比较受大家欢迎的方式.但是对于一些小型的应用,如一些移动APP,通常的数据库过于庞大,而轻便的SQLite则能解决这一问题.不但操作方便,而且只需要要一个文件即可,在这里我们来说一说使用C#语言操作SQLite数据库. 一.NuGet引入SQLite库 在VS菜单:工具→NuGet包管理器→管理解决方案的NuGet程序包 打开NuGet解决方案窗口. 搜索 sqlite,选择官方的库安装到指定的项目中.: 提示

  • C# SQLite库使用技巧

    1.SQLite介绍 SQLite,是一款轻型的数据库,是遵守的ACID关系型数据库管理系统,它包含在一个相对小的C库中.它的设计目标嵌入式是的,而且已经在很多中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等. SQLite is a software library that implements a self-contained,

  • python学习——内置函数、数据结构、标准库的技巧(推荐)

    我作为一名python初学者,为了强化记忆有必要把看过的一些优秀的文章中一些技巧通过notebook的方式练习一次.我认为这么做有几个优点:一来加深印象:二来也可以将学习过的内容保存方便日后查阅:第三也可以培养我写博的习惯(一直都没那个习惯) jupyter notebook格式的文件github下载: 身为程序员除了需要具备解决问题的思路以外,代码的质量和简洁性也很关键,今天又学习到了一些觉得自己很高级的内容跟大家分享,内容包括: Python内置函数开始 Python对数据结构的天然支持 P

  • C#/Java连接sqlite与使用技巧

    1)下载sqlite jdbc驱动http://www.xerial.org/maven/repository/artifact/org/xerial/sqlite-jdbc/ 2)将下载的驱动加入eclipse项目的built path中 3)示例代码: 复制代码 代码如下: package com.hedalixin; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStat

  • C# SQlite操作方法小结

    本文实例分析了C# SQlite操作方法.分享给大家供大家参考,具体如下: 最近项目需求用C#保存一些数据,如此先总结一下.需要下载Sqlite 库 SourceForge 链接网址http://sourceforge.net/projects/sqlite-dotnet2/或到官方网http://www.sqlite.org/download.html下载都可以,下载之后安装.在C#项目中添加引用 引入安装目录bin中的System.Data.SQLite.dll.添加命名空间using Sy

  • powershell玩转sqlite数据库详细介绍

    脚本经常需要处理文本,有时候是行列整齐文本.那么powershell脚本处理行列文本有几种方法呢?一种是excel,另外的一些是?access?sqlite? sqlite是一个很小巧的,很方便嵌入到脚本语言中的,关系型数据库.它给powershell提供了一个免费的,处理行列整齐数据,存储数据,统计数据的极品神器. 只要你学会了它,上天入地皆可去得.而且以后学sql server,mysql,都类似,没有难度. 带着引号搜本文关键字: "^_^上天入地皆可去^_^" 发文初衷:世界上

  • SQLite数据库管理系统-我所认识的数据库引擎

    SQLite 是一款轻量级的.被设计用于嵌入式系统的关联式数据库管理系统.SQLite 是一个实现自我依赖.纯客户端.零配置且支持事务的数据库引擎.它由D. Richard Hipp首次开发,目前已是世界上最广泛部署的开源数据库引擎. 本文中,我们将介绍如下内容: 创建一个SQLite 数据库 复制代码 代码如下: SQLiteConnection conn = new SQLiteConnection("Data Source=mytest.s3db"); conn.Open();

  • PHP使用GD库输出汉字的方法【测试可用】

    本文实例讲述了PHP使用GD库输出汉字的方法.分享给大家供大家参考,具体如下: 一.原理 PHP中的GD库支持中文,但是必须要以UTF-8格式的参数来进行传递.下面先说一下汉字的UTF-8编码的求得. 1. 用WORD2000或WINDOW 2000下的记事本编辑所要显示的汉字. 2. 把所编辑的文字存成格式为UTF-8格式的文件. 3. 用一个16进制的编辑器(如用PCTOOLS的EDIT功能)打开这个文件,这时会看到打开的文件里面有一些16进制的字符.一个汉字占三个字节,所以应该选择编辑汉字

  • Android使用SQLite数据库的示例

    一. 简介 SQLite数据库是一个轻量级的DBMS(数据库管理系统).SQLite使用单个文件存储数据,Android标准库包含SQLite库以及配套使用的一些Java辅助类.主要特点:轻量级,单一文件,跨平台,开源. 二. Android中SQLite数据库的使用 1.创建SQLite数据库 SQLiteDatabase db= SQLiteDatabase.openOrCreateDatabase( "/data/data/" + getPackageName() + "

  • 深入SQLite多线程的使用总结详解

    SQLite支持3种线程模式: 单线程:这种模式下,没有进行互斥,多线程使用不安全.禁用所有的mutex锁,并发使用时会出错.当SQLite编译时加了SQLITE_THREADSAFE=0参数,或者在初始化SQLite前调用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)时启用. 多线程:这种模式下,只要一个数据库连接不被多个线程同时使用就是安全的.源码中是启用bCoreMutex,禁用bFullMutex.实际上就是禁用数据库连接和prepared stat

  • 在Lua程序中使用SQLite的教程

     SQLite导入 我们可以用一个简单语句导入SQLite库,假设Lua中正确实现并已完成.在安装过程中,文件夹libsql包含数据库相关的文件. 复制代码 代码如下: sqlite3 = require "luasql.sqlite3" 变量sqlite3将提供通过参照主sqlite3表访问该功能. 建立连接 我们成立了发起sqlite环境,然后创建环境的连接.它如下所示. 复制代码 代码如下: local env  = sqlite3.sqlite3() local conn =

随机推荐