SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的。我们需要的sqlite3.lib文件并不在其中,需要我们自己动手了。

这儿要用到visual studio提供的Visual Studio Command Prompt工具了。打开之后,进入含有sqlite3.dll和sqlite3.def的目录下,输入以下命令:

LIB /DEF:sqlite3.def /MACHINE:IX86 

就能生成sqlite3.exp和sqlite3.lib文件了,这样在工程中就可以加入lib文件进行编译了。

SEC 1:

因为只是演示API,所以这次在vs2010下建立一个空的win32工程SQLite3Test,在工程的属性-链接-输入中添加sqlite3.lib的引用。添加新的文件main.cpp,写一个main函数,并编译一下。

好,接下来把sqlite3.h/def/exp/lib通通放进SQLite3Test\SQLite3Test\目录下,跟main.cpp在一起,如图:

把sqlite3.dll跟生成的exe放在一起。

SEC 2:

接下来开始进行sqlite3的使用。引入sqlite3.h头文件,并写下如下代码:

#include <iostream>

#include "sqlite3.h"

 

using namespace std;

 

int main(int argc, char** argv)

{

    sqlite3 * conn = NULL;

    char * err_msg = NULL;

    char sql[200] = "";

 

    // 打开数据库, 创建连接

    if(sqlite3_open("test.db", &conn) != SQLITE_OK)

    {

        printf("无法打开!");

    }

 

    // 关闭连接。

    if (sqlite3_close(conn) != SQLITE_OK)

    {

        printf("无法关闭,错误代码: %s\n", sqlite3_errmsg(conn));

        exit(-1);

    }

 

    printf("操作成功!\n");

 

    return 0;

}

sqlite3_open的函数原型如下:

SQLITE_API int sqlite3_open(

  const char *filename,   /* Database filename (UTF-8) */

  sqlite3 **ppDb          /* OUT: SQLite db handle */

);

作用就不言而喻了,打开数据库。

第一个参数是数据库文件的名称,如果没有,那就会自动创建一个。

第二个参数是sqlite3的实例句柄的指针的指针。。(看到这儿我想起来,当时在linux下自己写mysql的C++api的时候,也是用的双重指针,搞死个人哟。。)

常言道:“有打开,就有关闭!”,所以sqlite3_close()就起了这个作用。

不过sqlite3_close的原型是这样的:

SQLITE_API int sqlite3_close(sqlite3 *); //要格外注意双重指针和普通指针。。

有了上面的万金油例子,想必已经对初始化有所了解了。运行后就在Debug目录下多了个test.db文件,不过大小为0KB,因为木有内容嘛!

SEC 3:

在数据库中创建表并插入数据。在open和close的之间写入如下代码:

// 执行SQL 

sprintf(sql, "CREATE TABLE test_for_cpp \

    (id int, name varchar(20), age int)"); 

if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) 



    printf("操作失败,错误代码: %s", err_msg); 

    exit(-1); 



 

//添加10条记录

for (int i = 0; i < 10; i++)

{

    // 执行SQL

    sprintf(sql, "INSERT INTO test_for_cpp \

        (id, name, age) VALUES \

        (%d, '%s', %d)", i, "testPeople", i);

    if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) 

{     

printf("操作失败,错误代码: %s", err_msg);     

exit(-1); 



}

sqlite3_exec的原型如下:

SQLITE_API int sqlite3_exec(

  sqlite3*,                                  /* An open database */

  const char *sql,                           /* SQL to be evaluated */

  int (*callback)(void*,int,char**,char**),  /* Callback function */

  void *,                                    /* 1st argument to callback */

  char **errmsg                              /* Error msg written here */

);

第一个参数为sqlite3实例。

第二个参数为要执行的sql语句。

第三个参数为回调函数的指针。因为这里只是创建表和插入数据,并没有数据返回,所以不需要填写回调函数。以NULL代替。

第四个参数为回调函数所要使用的参数。同第三条。

第五个参数为错误信息。

这次再运行一下,就可以看到test.db已经不再是0KB了。

SEC 4:

再常言道:“有插入,就有读取!”下面来读取数据库文件中的数据。

刚才提到了sqlite3_exec的回调函数,现在需要这个函数了。首先声明一个回调函数:

int sqlite3_exec_callback(void *data, int nColumn, 

                          char **colValues, char **colNames);

四个参数的类型不能变。

然后写下该回调函数的实现:

int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames)

{

    for (int i = 0; i < nColumn; i++)

    {

        printf("%s\t", colValues[i]);

    }

    printf("\n");

 

    return 0;

}

接下来在插入条目语句的后面写下下面的语句:

// 查询

sprintf(sql, "SELECT * FROM test_for_cpp");

sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg);

TIP: 前面创建表、插入数据的代码可以先注释掉,否则运行一次就会插入10条数据,会造成点困扰。

运行就可以看到结果了:

因为该回调函数每从数据库中取出一条数据就要调用一次,所以这是最耗时间的过程,这块代码应该尽量高效。

这只是一个简单的例子,不过已经足够平时的小众软件使用了。一些高级的用法比如sqlite3_db_mutex(读写互斥锁)、sqlite3_backup_step(差异备份)等等,就可以看看sqlite3官方的教程了(猛戳传送)。

作者:satanness

原文链接:http://www.2cto.com/kf/201208/147428.html

VS 与 SQLite数据库 连接的更多相关文章

  1. Java操作Sqlite数据库-jdbc连接

    Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...

  2. onethink连接操作 sqlite 数据库

    直接上干货:一个简单的demo onthink本身已经有sqlite数据库的驱动 不需要在下载 common下面的config文件: 'SQLITE'=> array( 'DB_TYPE' =& ...

  3. VS2010连接SQLite数据库

    Visual studio 2010及以上版本,连接SQLite数据库 1.在Sqlite开发站点下载SQLite的.exe安装包 Ctrl+F搜索这条语句:This is the only setu ...

  4. C#连接SQLite数据库方法

    --结合Enterprise Library连接,操作SQLite 企业库是我们常用的框架之一,可以从http://entlib.codeplex.com/下载Enterprise Library 5 ...

  5. Python3实现连接SQLite数据库的方法

    本文实例讲述了Python3实现连接SQLite数据库的方法,对于Python的学习有不错的参考借鉴价值.分享给大家供大家参考之用.具体方法如下: 实例代码如下: ? 1 2 3 4 5 6 7 8 ...

  6. Perl连接Sqlite数据库

    Sqlite是一个小巧的嵌入式关系型数据库,几乎可以嵌入所有编程语言,特别是C,C++,PHP,Perl等.这里就介绍如何用Perl连接并操作Sqlite数据库. use DBI; # perl用以操 ...

  7. ASP.net与SQLite数据库通过js和ashx交互(连接和操作)

    ASP.net与SQLite数据库通过js和ashx交互(连接和操作): 废话(也是思路):用的是VS2010,打算做网站前后台.由于不喜欢前台语言里加些与html和css和js的其他内容,想实现前后 ...

  8. 一起学微软Power BI系列-使用技巧(6) 连接Sqlite数据库

    好久没有研究Power BI了,看到高飞大神弄的东西,太惭愧了.今天有个小东西,数据在Sqlite里面,想倒腾到Power BI Desktop里面折腾一下,结果发现还不直接支持.所以只好硬着头皮上去 ...

  9. python web开发-flask连接sqlite数据库

    在之前的文章中我们介绍了如何在centOS中安装sqlite数据库. Sqlite安装完成后,本节就用flask来连接和操作sqlite数据库. 1.       数据准备 先在sqlite3中创建一 ...

随机推荐

  1. 【转】DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)

    这两天正在学习FPGA如何控制DDR3的读写,找到一篇个人感觉比较有意义的文章,可以对DDR的内部结构有一个初步的了解.原文出处:http://blog.chinaunix.net/uid-28458 ...

  2. ASP.NET-----Repeater数据控件的用法总结(转)

    一.Repeater控件的用法流程及实例: 1.首先建立一个网站,新建一个网页index.aspx. 2.添加或者建立APP_Data数据文件,然后将用到的数据库文件放到APP_Data文件夹中. 3 ...

  3. jQuery实现的Div窗口震动效果实例

    本文实例讲述了jQuery实现的Div窗口震动效果.分享给大家供大家参考.具体如下: 这是一款jQuery窗口震动效果代码,在Div边框内点击一下鼠标,它就开始震动了,适用浏览器:IE8.360.Fi ...

  4. javascritp日期函数总结

    getDate()与getDay()的区别: obj.getDate()返回一个月中的某一天:obj.getDay()返回一个星期中的某一天. getYear()与getFullYear()的区别: ...

  5. VBA添加表格

    Sub 添加表格() ' If MsgBox("要为所有表格添加列吗?", vbYesNo + vbQuestion) = vbYes Then To ActiveDocument ...

  6. WinForm程序安装、发布流程

    一  签名 所谓签名就是给应用程序一个身份,申请一个专利.签名的时候需要选择证书.就向我们上学一样,得奖了老师给你发个证书.如果不进行签名,杀毒软件会把你打包后的exe文件作为病毒处理. 签名的步骤: ...

  7. Knockout.Js官网学习(visible绑定)

    前言 让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值. 简单的绑定 首先还是先定义一个ViewModel var AppViewModel = { shou ...

  8. php中iconv函数使用方法

    最近在做一个程序,需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些. iconv函数库能够完成各种字符集 ...

  9. c#判断网络连接状态示例代码

    使用c#判断网络连接状态的代码. 代码: public partial class Form1 : Form { [DllImport() == true) { label1.Text = " ...

  10. 生日蛋糕 (codevs 1710) 题解

    [问题描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri,高度为Hi的圆柱 ...