只为成功找方向,不为失败找借口

每天都不能停止前进的脚步
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SQLite之C#连接SQLite

Posted on 2017-11-17 11:21  冰碟  阅读(31217)  评论(1编辑  收藏  举报

SQLite是一个开源、免费的小型的Embeddable RDBMS(关系型数据库),用C实现,内存占用较小,支持绝大数的SQL92标准,现在已变得越来越流行,它的体积很小,被广泛应用于各种不同类型的应用中。SQLite已经是世界上布署得最广泛的SQL数据库引擎,被用在无以计数的桌面电脑应用中,还有消费电子设备中,如移动电话、掌上电脑和MP3播放器等。

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它 占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多 程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度 比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

  官方网站:http://www.sqlite.org/

      详细简介:http://baike.baidu.com/view/19310.htm

 

要使用sqlite保存数据,则需要用到SQLite操作驱动的dll,可以在官网下载,安装完成后,引用安装目录下的System.Data.SQLite.dll文件,

可以在我百度网盘下载:sqlite-netFx40-setup-bundle-x64-2010-1.0.96.0.exe

 

 

 

你也可以直接在项目中安装sqlite,项目会自动添加引用

 

 

 

安装完成后,你会发现。app.config中会自动生成配置代码

复制代码
 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" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
 6         <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null" />
 7     </configSections>
 8     <system.data>
 9         <DbProviderFactories>
10             <remove invariant="System.Data.SQLite.EF6" />
11             <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" 
type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> 12 </DbProviderFactories> 13 </system.data> 14 <entityFramework> 15 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 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 <connectionStrings> 22 <add name="sqlite" connectionString="Data Source=|DataDirectory|\document.db;Pooling=true;FailIfMissing=false" 23 providerName="System.Data.SQLite" /> 24 </connectionStrings> 25 </configuration>
复制代码

 

 

 

这些步骤完成后,就可以操作sqlite数据库。如果你链接数据库的时候。提示:

未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确的程序。

这是因为目标平台不匹配, 原因是SQLite下载的平台类型不对造成的,因为你下载的sqlite驱动分x86和x64位,你可以把项目平台改成匹配的,右键项目属性:

 

 

前期准备完成,在编码前,当然少不了一个工具,来对数据库进行管理。创建库、表、执行SQL语句操作,

比如:SQLite Expert Personal 3,Navicat for SQLite等等,

 

SQLite Expert Personal 3界面,

 

我这里使用Navicat for SQLite来管理sqlite,

打开Navicat for SQLite,单击连接,如图:

 

连接成功后,创建表,添加数据。

 

我这里创建一个表:document.db,并添加简单的数据用于测试

 

 

接下来可以在vs中编码,如果用过sql server,那么sqlite就没什么难的

 使用原生态的ADO.NET访问SQLite

  原生态的访问,就是说直接用connection和command这些对象打开数据库,然后打开连接,进行数据的操作。

在App.config中配置connectionStrings

1 <connectionStrings>
2         <add name="sqlite" connectionString="Data Source=|DataDirectory|\document.db;Pooling=true;FailIfMissing=false"
3           providerName="System.Data.SQLite" />
4     </connectionStrings>

 

上面的connectionstring配置节的db就是SQLite的数据库文件,将它放在Web应用的App_Data目录,|DataDirectory|就代表这个目录的位置,后面的就是文件名。   剩下的就是我们使用企业库访问SQL Server是一样的了。

到这里。其实有一个盲区。就是App_Data,是web应用中才有,但winform中是没有的。在winform中DataDirectory被程序弄成了apppath/bin/debug目录,所以,此时。你需要把document.db赋值到debug目录下面。

现在来测试是否可以成功访问数据库并读取数据

复制代码
 1    string sql = "SELECT * FROM userInfo";
 2             //string conStr = "D:/sqlliteDb/document.db";
 3             string connStr = @"Data Source=" + @"D:\sqlliteDb\document.db;Initial Catalog=sqlite;Integrated Security=True;Max Pool Size=10";
 4             using (SQLiteConnection conn = new SQLiteConnection(connStr))
 5             {
 6                 //conn.Open();
 7                 using (SQLiteDataAdapter ap = new SQLiteDataAdapter(sql, conn))
 8                 {
 9                     DataSet ds = new DataSet();
10                     ap.Fill(ds);
11 
12                     DataTable dt = ds.Tables[0];
13                 }
14             }
复制代码

设置一个断点,发现已经得到sqlite中的数据

 

如果想读取app.config中的数据库连接字符串

复制代码
 1 string config = System.Configuration.ConfigurationManager.ConnectionStrings["sqlite"].ConnectionString;
 2             using (SQLiteConnection conn = new SQLiteConnection(config))
 3             {
 4                 conn.Open();
 5                 //DbCommand comm = conn.CreateCommand();
 6                 //comm.CommandText = "select * from userinfo";
 7                 //comm.CommandType = CommandType.Text;
 8 
 9                 //conn.Open();
10                 using (SQLiteDataAdapter ap = new SQLiteDataAdapter(sql, conn))
11                 {
12                     DataSet ds = new DataSet();
13                     ap.Fill(ds);
14 
15                     DataTable dt = ds.Tables[0];
16                 }
17             }
复制代码

 

 

 

使用SQLite.NET访问SQLite

  SQLite.NET也是一个数据访问组件,其中的System.Data.SQLite 就好像是.NET自带的System.Data.SqlClient一样。里面包含了connection、command等数据访问的常用对象,只是他们前面都有一个前缀sqlite。

回到之前的app.config。当用NuGet程序包安装sqlite后。里面自动生成了如下代码

复制代码
1 <system.data>
2         <DbProviderFactories>
3             <remove invariant="System.Data.SQLite.EF6" />
4             <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" 
type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> 5 </DbProviderFactories> 6 </system.data>
复制代码

 

即:添加一个DbProviderFactory的创建源,在代码中就可以使用DbProviderFactory类来创建SQLite的数据访问对象。

复制代码
 1 DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite.EF6");
 2             using (DbConnection conn = fact.CreateConnection())
 3             {
 4                 conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["sqlite"].ConnectionString;
 5                 conn.Open();
 6                 DbCommand comm = conn.CreateCommand();
 7                 comm.CommandText = "select * from userInfo";
 8                 comm.CommandType = CommandType.Text;
 9                 using (IDataReader reader = comm.ExecuteReader())
10                 {
11                     while (reader.Read())
12                     {
13                         string dd = reader["name"].ToString();
14                     }
15                 }
16             }
复制代码

同样测试看结果:

 

 

可以用SQLiteConnection.CreateFile("D:/d.db");直接创建一个数据库文件

 

 

网上找了一个sqlite帮助类,有需要的可以看下

 View Code

 

 

其他资料:

  http://www.cnblogs.com/virusswb/archive/2010/09/17/SQLite1.html

  http://blog.csdn.net/heqichanggg/article/details/5784839

  http://www.cnblogs.com/luxiaoxun/p/3784729.html

  http://www.cnblogs.com/xugang/archive/2011/04/19/2020713.html