关于.Net中使用SQLite数据库的方法

参考:

    SQLite之C#连接SQLite 
    https://www.cnblogs.com/icebutterfly/p/7850689.html

总结:

     关于SQLite的库安装比较特殊:

     下载地址:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki  --ok!
               https://www.sqlite.org/download.html。---用于安卓、Mac、Linux等平台的下载。 

     下载安装包:
      1)sqlite-netFx45-setup-x64-2012-1.0.108.0.exe (用于安装对应的VC++库)。---测试ok!
      2)sqlite-netFx45-binary-Win32-2012-1.0.108.0.zip包。(内含xml函数注释!用于获取x86版本的SQLite.Interop.dll文件,如果出现程序加载镜像失败的错误,就替换x86版本的interop库即可解决。)
      (为了与其它软件保持一致,建议安装.Net 4.5版本的!)

     默认安装路径:C:\Program Files\System.Data.SQLite

     .Net引用:只需引用安装bin目录下的,System.Data.SQLite.dll一个文件即可!

     注意:

      1、带bundle的表示动态库是按混合模式编译的,还有纯x86和纯x64模式的库,共3种,按实际需要选择。(与项目的生成--目标平台一致才行!建议下x64版本的!!)

      2、下载的库,一定要安装,才行!!(只引用,未安装,运行会报错!!)

      3、.Net使用SQLite,只需要引用System.Data.SQLite.dll,根本用不着 sqlite3.dll。没想到吧!


SQLite 介绍:

    SQLite,是一款轻型的数据库,用于本地的数据储存。开源数据库。

    优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了;作为轻量级数据库,他的处理速度也足够快;支持的的容量级别为T级;独立: 没有额外依赖;开源;支持多种语言。

    详细优点:

   1、它的设计目标是嵌入式的,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。

   2、跨平台和多语言支持:它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,
      比如C, C++, PHP, Perl, Java, C#,Python, Ruby等。

   3、速度快:比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
      (比一些流行的数据库在大部分普通数据库操作要快。)

   4、支持数据库大小至2TB。

   5、足够小, 大致13万行C代码, 4.43M

   6、简单, 轻松的API

   7、源码完全的开源, 你可以用于任何用途, 包括出售它。

   8、它还支持事务处理功能等等。


使用.NET操作SQLLITE:

示例代码1:

        public string Query()
        {
            string datasource = "e:/tmp/test.db";
            System.Data.SQLite.SQLiteConnection.CreateFile(datasource);
            //连接数据库
            System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection();
            System.Data.SQLite.SQLiteConnectionStringBuilder connstr = new System.Data.SQLite.SQLiteConnectionStringBuilder();
            connstr.DataSource = datasource;
            connstr.Password = "admin";//设置密码,SQLite ADO.NET实现了数据库密码保护
            conn.ConnectionString = connstr.ToString();
            conn.Open();
            //创建表
            System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand();
            string sql = "CREATE TABLE test(username varchar(20),password varchar(20))";
            cmd.CommandText = sql;
            cmd.Connection = conn;
            cmd.ExecuteNonQuery();
            //插入数据
            sql = "INSERT INTO test VALUES('a','b')";
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();
            //取出数据
            sql = "SELECT * FROM test";
            cmd.CommandText = sql;
            System.Data.SQLite.SQLiteDataReader reader = cmd.ExecuteReader();
            StringBuilder sb = new StringBuilder();
            while (reader.Read())
            {
                sb.Append("username:").Append(reader.GetString(0)).Append("\n")
                .Append("password:").Append(reader.GetString(1));
            }
            //MessageBox.Show(sb.ToString());

            return sb.ToString();
        }

示例代码2:事务操作:

using (SQLiteConnection conn = new SQLiteConnection(connectionString))
            {
                conn.Open();
                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = conn;
                SQLiteTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                }
                catch (System.Data.SQLite.SQLiteException E)
                {
                    tx.Rollback();
                    throw new Exception(E.Message);
                }

 

问题1:ASP.Net Web程序,未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。2018-8-3
   原因:在IIS中打开对应的应用程序池:右键-高级设置-常规-启用32位应用程序-True;

   实际原因:SQLite.Interop.dll的版本,与项目属性的平台AnyCPU不一致造成的。
   解决方法:重新下载SQLite的Win64位版本,即可!即如下:
     下载 sqlite-netFx45-binary-win32-2012-1.0.108.0.zip,用里面的x86版本的SQLite.Interop.dll替换即可。

   详细原因、分析过程如下:

   经过研究,造成加载格式失败,是在于SQLite.Interop.dll的版本:x64或是x86,复制到程序的bin目录下。


   对官网下载页面的分析:

    1、SQLite数据库为什么下载的都是预编译的文件,而不是编译好的dll库?? 

   官网解释:SQLite的.Net支持库,运行需要VC ++运行时库的相应版本(例如2005,2008,2010,2012,2013,2015,2017)。在setup安装包中,会自动安装。---(所以需要安装!而不是单独sqlite3.dll就可以的。----也就是说:有了VC++相应的运行库,和相关的SQLite的dll就可以运行了。)

    二进制包旨在供开发人员使用,以便通过XCOPY部署其应用程序到客户机器上。(--XCOPY部署:就是说,开发也可以直接下这个二进制包。但是还需要单独安装对应的VC++运行库。否则也不能运行。)

    2、安装包的种类很多:setup、binary、static包的区别??
    - setup可自动安装对应的VC++运行库。(官网不推荐)--但是单独下载VC++库比较麻烦。
    - binary可不用安装,可直接XCOPY部署(官网推荐的)。
    - static包用于无法在客户机器,安装Visual C ++库的情况。

    另外:bundle和普通安装包的区别??
     - bundle包:可自动安装VC++库,并且,用于混合模式,并且使用全局程序集缓存(根本不使用),官网不推荐。
     - 普通包:可自动安装VC++库,分为x86或x64的两个版本,可根据需要下载。


解决办法:

- 通过setup安装包。

- 直接下载二进制包,不安装的方式。
  使用本机库预加载功能(默认启用),可自动加载所需的x86或x64的SQLite.Interop.dll。--推荐!
  (注意:还要包括System.Data.SQLite.dll.config 配置文件。)选择.Net 4.0版本(与IIS一致。)

  -- 但是,实际上单独下载VC++运行库,很麻烦。所以,还的先安装setup包,满足基础的运行环境。
     然后,引用在程序中的SQLite库。(而不是c盘安装目录下的库。)

     综合:下载:1)sqlite-netFx45-setup-x64-2012-1.0.108.0.exe包(用于安装对应的VC++库)。
                 2)sqlite-netFx45-binary-Win32-2012-1.0.108.0.zip包。(用于获取x86版本的SQLite.Interop.dll)
              
             然后,引用安装目录下的xx库(C:\Program Files\System.Data.SQLite\2012\bin),如果加载镜像失败的错误,就替换x86版本的interop库即可解决。----最终方案!!2018-8-6
                 (说明:vc++库,也分x86和x64版本,唉!!需要准备2个setup包。我的PC是Win10 64位的,就只下载x64的安装包即可)

  说明:
     sqlite-netFx40-binary-Win32-2010-1.0.108.0.zip
  和 sqlite-netFx40-binary-x64-2010-1.0.108.0.zip  
   两个包,只有SQLite.Interop.dll不同,其它文件都一样。


此外,也可以采用预加载配置解决:由程序会自动加载x86,还是x64版本的SQLite.Interop.dll文件。

   运行库目录如下:

\ System.Data.SQLite.dll(必需的,仅限托管的核心程序集)
\ x86 \ SQLite.Interop.dll(必需,x86本机互操作程序集)
\ x64 \ SQLite.Interop.dll(必需,x64本机互操作程序集)
 
上面的字符串“ ”表示应用程序二进制文件将在目标计算机上部署的目录。

配置文件:System.Data.SQLite.dll.config

   其中,修改预加载功能配置:
     

你可能感兴趣的:(关于.Net中使用SQLite数据库的方法)