FAG自我笔记VS2010使用sqlite

FAG笔记:
FAG一、准备链接库
去官网http://www.sqlite.org/download.html下载需要的文件。
下载 sqlite-dll-win32-x86-3080803.zip,解压缩后里面有两个文件:sqlite3.dll和sqlite3.def。
下载 sqlite-amalgamation-3080803.zip,解压缩后里面有4个文件:sqlite3.h、sqlite3ext.h、shell.c、sqlite3.c。

FAG二、第一个方案:头文件和静态链接库
头文件使用sqlite-amalgamation-3080803中的sqlite3.h。

静态链接库需要自己手动生成,生成步骤如下:
1.打开VS2010,文件–>新建–>项目–>Visual C+±->Win32–>Win32项目,项目名称输入SQLite,点击下一步,应用程序选择“静态库”,附件选项中取消选中“预编译头”,点击"完成"。
2.将sqlite3.c,sqlite3.h两个文件复制到当前工程目录下,然后在项目中将这两个文件添加进来,然后编译运行,中间会出现数据类型转换的警告,不用管它,点击确定,然后在Debug目录下会生成一个SQLite.lib(名字与工程名字一样)静态库文件。

FAG三、使用
准备好静态链接库之后,要在VC中使用需要:#include <sqlite3.h>,添加静态库SQLite.lib(具体步骤同添加动态链接库头文件和导入库lib把文件一样)

//--------------------------------------------------------------------------------
作者:明月清风-精进不止
来源:CSDN
原文:https://blog.csdn.net/xiaxiaojing/article/details/44493555
版权声明:本文为博主原创文章,转载请附上博文链接!

以前最早接触的是SQL Server2005,这个数据库一般适合数据量超大的情况,比如说卫星的星历数据等。后来接触互联网,发现Mysql还是很实用的,中等易用。目前工作中需要使用使用数据库,但是又不想付费,听人讲sqlite是不错的选择,可以嵌入到应用程序中,另外简单,只要有个链接库就可以搞定。下面是学习记录总结一下:

一、准备链接库
去官网http://www.sqlite.org/download.html下载需要的文件。
下载 sqlite-dll-win32-x86-3080803.zip,解压缩后里面有两个文件:sqlite3.dll和sqlite3.def。
下载 sqlite-amalgamation-3080803.zip,解压缩后里面有4个文件:sqlite3.h、sqlite3ext.h、shell.c、sqlite3.c。
下载 sqlite-shell-win32-x86-3080803.zip,解压缩后里面有1个文件:sqlite3.exe。

二、使用sqlite有两个方案可选:

==========================
第一个方案:头文件和静态链接库
头文件使用sqlite-amalgamation-3080803中的sqlite3.h。
静态链接库需要自己手动生成,生成步骤如下:
1.打开VS2010,文件–>新建–>项目–>Visual C+±->Win32–>Win32项目,项目名称输入SQLite,点击下一步,应用程序选择“静态库”,附件选项中取消选中“预编译头”,点击"完成"。
2.将sqlite3.c,sqlite3.h两个文件复制到当前工程目录下,然后在项目中将这两个文件添加进来,然后编译运行,中间会出现数据类型转换的警告,不用管它,点击确定,然后在Debug目录下会生成一个SQLite.lib(名字与工程名字一样)静态库文件。

准备好静态链接库之后,要在VC中使用需要:#include <sqlite3.h>,添加静态库SQLite.lib(具体步骤同添加动态链接库头文件和导入库lib把文件一样)

========================
第二个方案:动态链接库、导入库和头文件

头文件使用sqlite-amalgamation-3080803中的sqlite3.h。

动态链接库使用sqlite-dll-win32-x86-3080803中的sqlite3.dll。

导入库需要依赖sqlite-dll-win32-x86-3080803中的sqlite3.def借助于VS环境生成。

导入库生成步骤:

1.启动Microsoft Visual Studio 2010 -->Visual Studio Tools -->Visual Studio 命令提示(2010);

2.使用命令 LIB /out:c:/sqlite3.lib /MACHINE:IX86 /DEF:c:/sqlite3.def (注意路径,此时需要将sqlite3.def拷贝到C盘跟目录下,生成的文件也在C盘根目录下)

3.生成结果如下:
准备好导入库之后,要在VC中使用需要:#include <sqlite3.h>,添加引入库和dll(具体步骤见其他文章)

四、生成可执行文件sqlite3.exe
1.打开vs2008 ,文件->新建->项目->Visual C+±>Win32->Win32 项目,项目名称输入SQLite,点击下一步,应用程序类型选择"控制台应用程序",附加选项中选中“空项目”。
2.将sqlite3.c,sqlite3.h,shell.c三个文件复制到这个工程目录下,然后在项目中将这两个文件添加进来,然后再编译运行,会出现数据类型转换的一些警告,不用管它,然后在Debug目录下就会生成一个sqlite3.exe文件。

五、运用sqlite3.exe创建数据库
1.将上面生成的sqlite3.exe文件放在任何位置
2.在CMD下进入到sqlite3.exe文件的目录下
3.在CMD命令提示符下输入sqlite3 test.db(test.db是数据库名)回车,执行完后,命令提示符自动跳转到"SQLITE>"状态。
注意:这时test.db数据库确实已经创建好了但是还是个临时的,所以现在还是看不到这个数据库!
4.create table user(name text); 这时可以看到这个数据库文件了。
5.如果下次还要使用此数据库时仍然使用sqlite3 test.db即可进入此数据库

sqlite图形界面工具:

看网上介绍,有很多种,自己亲身体验了SQLiteSpy_1.9.8,下载地址:http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index,这款是绿色免安装版,解压缩就可以直接使用了。
打开界面发现要是修改编辑表中数据的话,有些不太好用,每次只能编辑一个cell,很麻烦。
后来看到火狐的插件,SQLite Manager 0.8.0 Firefox Plugin , 安装好火狐之后再安装该插件就可以通过浏览器直接管理SQLite数据库了。这是一个简单和有用的功能,能完成日常大多数管理工作。 下载地址:点击下载。点击进去之后,见下图:

================================

在sqlite官网 http://www.sqlite.org/download.html 上下载sqlite-amalgamation-3071000.zip 和sqlite-dll-win32-x86-3071000.zip(我用的此版本)。

#include <sqlite3.h>
#include <iostream>
#include <string>

using namespace std;

bool createTable();//创建表
bool insert();
bool Delete();
bool update();
bool select();
int print_result_cb(void* data,int n_columns,char** column_values,char** column_names);
void print_row(int n_values, char** values);

sqlite3 *pDB = NULL;
char * errMsg = NULL;
int rc = 0;

int main()
{
    string strConn = "D:/cpp/database/sqlite/test.db";
    //打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件
    rc = sqlite3_open(strConn.c_str(), &pDB);

    if(rc)
    {
        cout<<"打开数据库 "<<strConn<<" 失败"<< endl;
        return 0;
    }
    try
    {
        //createTable();
        //insert();
        //Delete();
        //update();
        select();

        sqlite3_close(pDB);  
    }
    catch(exception &ex)
    {
        cout<<"error:"<<ex.what()<<endl;
    }
    catch(...)
    {}

    return 1;
}

bool createTable()
{
    //插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息
    //函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
    //第三个参数为callback函数,这里没有用,第四个参数为callback函数
    //中的第一个参数,第五个为出错信息
    int rc = sqlite3_exec(pDB, "create table tblTest(id int, name QString)", 0, 0, &errMsg);

    if(rc == SQLITE_OK)
       cout<< "创建表 tblTest 成功!" << endl;
    else
       cout<<"建表失败:"<<errMsg<< endl;
    return true;
}

bool insert()
{
    //往表中添加数据
    int id = 1;
    char name[] = "大气象";
    char value[500];
    //定义一条参数SQL命令,其中chn,eng为需要插入的数据    
    sprintf(value, "insert into tblTest(id, name)values(%d, '%s')", id, name);

    rc = sqlite3_exec(pDB,value,0,0,&errMsg);
    return 1;
}
bool Delete()
{
    sqlite3_exec(pDB,"delete from tblTest where id = 100",0,0,&errMsg);
    return 1;
}
bool update()
{
    char *pSql = "update tblTest set name = ? where id = ?";
    sqlite3_stmt *ppStmt;
    if(SQLITE_OK != sqlite3_prepare_v2(pDB,pSql,strlen(pSql),&ppStmt,0))
    {
        cout<<"update tblTest : prepare sql error !!!"<<endl;
        sqlite3_finalize(ppStmt);
        return 0;
    }
    sqlite3_bind_text(ppStmt,1,"ok",-1,SQLITE_TRANSIENT);    //绑定值到第一个?
    sqlite3_bind_int(ppStmt,2,100);                            //绑定值到第二个?
    int ret = -1 ;
    while(ret != SQLITE_DONE)
    {
        ret = sqlite3_step(ppStmt);
    }
    sqlite3_reset(ppStmt);
    sqlite3_finalize(ppStmt);

    return 1;
}
bool select()
{
    //查询一条记录
    char value[500];
    //定义一条查询语句,其中条件为当english为target时的中文记录
    //print_result_cb为callback函数,在其中可以得到查询的结果,具体见下文
    //sprintf(value,"select * from tblTest where name='%s'", "大气象");
    sprintf(value,"select * from tblTest", "hello");
    rc = sqlite3_exec(pDB,value,print_result_cb, 0, &errMsg);

    if(rc == SQLITE_OK)
    {
        cout<<"select the record successful!"<<endl;
    }
    else
    {
        cout<<errMsg<<endl;        
    }           
    return 1;
}
//callback回调函数print_result_cb的编写,其中data为sqlite3_exec中的第四个参数
//第二个参数是栏的数目,第三个是栏的名字,第四个为查询得到的值得。
//这两个函数输出所有查询到的结果
//有多少列回调函数就会执行多少次。
int print_result_cb(void* data,int n_columns,char** column_values,char** column_names)
{
    static int column_names_printed = 0;
    int i; 
    if (!column_names_printed) //首次执行结果是列名
    {
        print_row(n_columns, column_names);
        column_names_printed = 1;
    }

    print_row(n_columns, column_values);
    return 0;
}
void print_row(int n_values,char** values)
{
    int i;
    for (i = 0; i < n_values; ++i) 
    {
        if (i > 0) 
        {
            printf("\t");
        }
        printf("%s", values[i]); 
    }
    printf("\n");
}
发布了94 篇原创文章 · 获赞 32 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/form88/article/details/83115867
今日推荐