之因此要作这个笔记,是由于在.NET中使用System.Data.SQLite的时候,遇到了些问题,这些问题是相对于引用其余dll没有遇到过的,因此做个笔记,记录一下。程序员
简单起见,首先创建一个控制台项目,这确定是.NET4.5以上的版本了,我用的是vs2017,其余版本的vs在引用System.Data.SQLite的时候有没有问题,这个就不得而知了。sql
首先仍是按照以往使用第三方dll文件(指是在引用管理器中搜索不到的dll)的思路,在项目文件夹下面创建一个文件夹dll,将System.Data.SQLite.dll放进去(前提是保证下载的dll是正确的版本),而后数据库
在项目中添加这个dll的引用。而后在项目的main函数中粘贴如下代码,这里只是为了能正常使用SQLite,因此代码设计的比较简单,固然代码也是网上找的函数
SQLiteConnection conn = null; string dbPath = "Data Source =" + Environment.CurrentDirectory + "/test.db"; conn = new SQLiteConnection(dbPath);//建立数据库实例,指定文件位置 conn.Open();//打开数据库,若文件不存在会自动建立 string sql = "CREATE TABLE IF NOT EXISTS student(id integer, name varchar(20), sex varchar(2));";//建表语句 SQLiteCommand cmdCreateTable = new SQLiteCommand(sql, conn); cmdCreateTable.ExecuteNonQuery();//若是表不存在,建立数据表 SQLiteCommand cmdInsert = new SQLiteCommand(conn); cmdInsert.CommandText = "INSERT INTO student VALUES(1, '小红', '男')";//插入几条数据 cmdInsert.ExecuteNonQuery(); cmdInsert.CommandText = "INSERT INTO student VALUES(2, '小李', '女')"; cmdInsert.ExecuteNonQuery(); cmdInsert.CommandText = "INSERT INTO student VALUES(3, '小明', '男')"; cmdInsert.ExecuteNonQuery(); conn.Close();
而后开始跑程序,出现了第一个问题:异常来自 HRESULT:0x8007000Bspa
网上搜索了一下解决方案,都说的是将项目属性里面的生成里面的平台目标改为x86或x64。再啰嗦一句,个人电脑系统是Windows server 2012 r2 标准版,妥妥的64位操做系统。操作系统
这里我选择的是x86,而后继续跑程序,结果仍是出现刚才的问题。而后选择x64,跑程序。好了,这回出现新问题了:异常来自 HRESULT:0x8007007Edebug
根据提示,说是没有SQLite.Interop.dll文件,因而将这个文件复制到刚才创建的dll文件夹中,并引进项目,结果又出问题了。不就是引用个第三方的dll文件吗,有必要出现那么多问题吗,心里已经很崩溃。设计
这个问题,我确实没办法了,网上也找不到合适的解决方案(主要是有些解决办法太麻烦,看都懒得看了)。怎么办呢,遇到问题总要解决吧,做为一个专业的程序员,码农,遇到问题必须有探索的精神,code
不能期望领导,不能期望同事,想一想本身还没赚到足够的钱,娶到白富美,走上人生的巅峰,想一想家里的父母.......开始胡思乱想了。想着想着,无心中打开了项目的bin文件夹里面的Debug文件夹,哎哟我server
去,发现了新大陆了,这个dll怎么出如今这里,我明明是放在dll文件夹里面的。再想到刚才的错误不是说没有SQLite.Interop.dll文件吗,那我把SQLite.Interop.dll文件也放到这里看看
再跑程序,哎哟我去,奇迹出现了,程序跑起来了,成功了,debug文件夹下,出现了test.db文件了,这不就是梦中情人白富美吗,总算出现了。
为了验证一下是否真的把数据写进去了,我简单些了个查询函数看了一下,果真没问题
总结:一、下载正确版本的SQLite,主要是32位仍是64位
二、将SQLite.Interop.dll和System.Data.SQLite.dll放到bin文件夹的debug文件夹下,而后只需引用System.Data.SQLite.dll就好
三、将项目属性里面的生成里面的平台目标改为x64,固然这是由于我电脑是64位的,若是是32位电脑也许不用这步操做了。
通常来讲,这样的对数据库的操做的代码,都是写在类库里面的,这里就有个地方须要注意了,在编写对SQLite使用的类库的时候,在类库中只需引用System.Data.SQLite.dll,文件放在什么地方无所谓,
只要能引用就行,而后编译经过后,在引用这个类库的项目里面,记得将SQLite.Interop.dll放到bin文件夹下面的debug文件夹,并且引用的项目的属性里面的平台目标记得改为x64。而类库没有这个要求。