前段时间在开发OrayTalk(傲瑞通企业即时通信系统)的聊天记录模块时用到了Sqlite,这是我第一次接触和使用Sqlite,整体感觉还是很不错的。这里把我使用Sqlite的经验跟大家分享一下。

一.关于Sqlite  

  Sqlite是一款开源的、适合在client和嵌入式设备中使用的轻量级数据库,支持标准的SQL。

  不像SqlServer或Oracle的引擎是一个独立的进程、通过TCP或命名管道等与程序进行通信,SQLite却是作为程序的一个部件、一个构成部分,使用Sqlite的方式就是直接在程序中进行API调用。

  原始的Sqlite是没有一个向SqlServer企业管理器的可视化操作程序的,可是有个第三方开发的应用SqliteStudio非常不错,主要的建库、建表、编辑数据、导出数据等功能都支持得非常好。SqliteStudio执行截图例如以下所看到的:

  

  Sqlite资源链接:

(1)Sqlite官网:能够从官网下载源代码、或下载已经编译好的二进制版本号。支持的系统包含:Linux、MacOS、Windows、.NET。

(2)SqliteStudio:好用的Sqlite可视化管理器。

二.在.NET中使用Sqlite

  从官网下载.NET版本号的Sqlite,其主要包含两个dll:SQLite.Interop.dll、System.Data.SQLite.dll。

(1)System.Data.SQLite.dll是一个标准的托管dll,我们能够直接在.NET项目中引用并使用它,就像使用.NET自带的System.Data命名空间中的各个对象一样。

(2)SQLite.Interop.dll是一个非托管的dll,是Sqlite引擎核心,我们须要将其复制到执行文件夹下,在执行时,它会被System.Data.SQLite.dll调用。

三.让Sqlite脱离VC++执行时

  我们在项目开发完成后測试的过程中发现,使用了Sqlite的client程序在某些机器上执行时会报错,例如以下所看到的:

  无法载入 DLL"SQLite.Interop.DLL";因为应用程序配置不对,应用程序未能启动。又一次安装应用程序可能会纠正这个问题。(异常来自 HRESULT:0x800736B1)

  经过一番折腾,才发现是这些机器上没有安装VC++执行时(Visual C++ 2005 SP1 runtime),而SQLite.Interop.dll的执行是须要VC++执行时支持的。这点太不友好了。我们的项目是基于.NET 2.0开发的,windows xp sp1 及以上版本号都自带了这个Framework,而这些机器不一定安装了VC++执行时。所以我第一反应就是,尝试让Sqlite在没有安装VC++执行时的机器上也能正常执行。

1.方案一

  我baidu了一下,有个似乎可行的方案是这种:将msvcm80.dll、msvcp80.dll、msvcr80.dll这几个动态库也放到执行文件夹下。这个方法我不太喜欢,于是我尝试自己动手解决这个问题。

2.方案二

  凭借我还未全然忘记的一点VC++基础,我知道VC++程序在编译时能够选择是动态链接到依赖的库还是静态链接,假设是静态连接,编译生成的二进制程序中就相当于包括了一份依赖库的拷贝。所以,我的想法是,又一次编译SQLite.Interop.dll,使其静态链接到VC++执行库。我下载了Sqlite的源代码,用VS2010打开,截图例如以下:

  SQLite.Interop.2010这个项目是核心,我们须要对它的一些设置略微做些改动,这些小改动我花了一些时间摸索才成功,这里就略去详细的摸索过程,直接给出摸索成果:

(1)打开SQLite.Interop.2010项目属性页面,配置属性 -> C/C++ -> 代码生成 -> 执行库,该项设置为 多线程调试 (/MTd)。

(2)继续 配置属性 -> 清单工具 -> 输入和输出 -> 嵌入清单,该项原来是“是”,改成“否”。

(3)显示全部项目文件,然后找到SQLite.Interop.2010.props文件,并打开。删掉当中的<INTEROP_MIXED_NAME>配置节点。

(4)从项目中移除“Resource Files”目录。

(5)又一次编译项目,生成的SQLite.Interop.dll便是我们所须要的。

四.下载成果

  除非特别需求,否则大家没有必要反复这一过程,我把生成的Sqlite二进制版本号直接提供给大家下载使用。

  能脱离VC++执行时执行的Sqlite (v1.0.93.0)  

让Sqlite脱离VC++ Runtime独立执行的更多相关文章

  1. 让Sqlite脱离VC++ Runtime独立运行

    前段时间在开发OrayTalk(傲瑞通)的聊天记录模块时用到了Sqlite,这是我第一次接触和使用Sqlite,总体感觉还是非常不错的.这里把我使用Sqlite的经验跟大家分享一下. 一.关于Sqli ...

  2. CodedUI自己主动化測试及脱离VS独立执行

    在VS中可创建"编码的UI測试".可录制软件操作,再回放,最后还能够脱离VS独立执行. 在VS中执行測试 创建项目codeuitest,控件布局.例如以下图: 在button单击事 ...

  3. 如何判断是否安装了VC RUNTIME

    先得说下GUID,它是Globally Unique Identifier的简称,中文翻译为“全球唯一标示符”,在Windows系统中也称之为Class ID,缩写为CLSID.对于不同的应用程序,文 ...

  4. windows环境下把Python代码打包成独立执行的exe

    windows环境下把Python代码打包成独立执行的exe可执行文件   有时候因为出差,突然急需处理一批数据.虽然写好的脚本存储在云端随用随取,然而编译的环境还需要重新搭建,模块也需要重新装载,从 ...

  5. windows环境下把Python代码打包成独立执行的exe可执行文件

    有时候因为出差,突然急需处理一批数据.虽然写好的脚本存储在云端随用随取,然而编译的环境还需要重新搭建,模块也需要重新装载,从头到尾这么一遍下来,也是要花费可观的时间成本的. 有没有什么办法,可以让.p ...

  6. Spring框架 JdbcTemplate类 @Junit单元测试,可以让方法独立执行 如:@Test

    package cn.zmh.PingCe; import org.junit.Test; import org.springframework.jdbc.core.BeanPropertyRowMa ...

  7. ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法

    ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法 有些情况下,SQL SERVER 2008r2中需要保存float,int类型的数据,当C 中的变量为double ...

  8. 如何解决 An error occured executing the Microsoft VC+runtime installer

    安装 postgresql 时遇见了 这个问题 There  has been an error.An error occured executing the Microsoft VC+ runtim ...

  9. 一种脱离VC编程软件的方法学习C/C++编程(搭建EditPlus实现在文本编辑框中执行.c文件

    网上下载一个EditPlus记事本安装好后就可以按照下面步骤进行搭建环境了: 一.工具(Tools)→配置用户工具(Configure UserTools...),[添加工具](Add Tool> ...

随机推荐

  1. sqlserver 无法初始化via支持库[QLVIPL.DLL]

    安装数据库后,在sqlserver configuration manager, sqlserver的网络配置,有将协议 shared memory,named pipes,tcp/ip,via全部启 ...

  2. 2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景.磁盘有 ...

  3. oracle在SQLPLUS 和PLSQL建 job 的区别

    oracle在SQLPLUS 和PLSQL建 job 的区别 //建立job variable test_job_really number; begin dbms_job.submit(:test_ ...

  4. Team Foundation Server 2015使用教程--读取器tfs组的checkin权限修改

  5. java设计模式:观察者模式

    package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...

  6. 房费制VB版本(一个)——系统分析

          首先.我们先回答两个个问题:         1.机房收费系统"是什么"?         2.机房收费系统应该"干什么"?        我的回答 ...

  7. NSIS:延时启动软件的几个方法及探索

    原文NSIS:延时启动软件的几个方法及探索 有时候,我们想要某软件开机启动,但又不要拖慢开机速度,那么,延时启动技术就显得比较重要了.轻狂在这方面曾经研究过,也实现了自己想要的功能,看看我是怎么做的吧 ...

  8. 在Mac OS上配置Android开发环境

    1)安装配置NDK 1.1 下载NDK并解压缩 下载路径 https://developer.android.com/tools/sdk/ndk/index.html 在terminal运行: chm ...

  9. socket套接字TCP API

    socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...

  10. 解析grant connect, resource to user语句

    今天同事问了一个问题:"创建用户分配的权限是:grant connect,resource to user;,可是建立view的时候失败了,错误是权限不够,后来我给这个用户分配了创建view ...