c++ sqllite3的使用

SQLite数据库是零配置的,sqlite数据库不同于SqlServer等数据库,SQLite不需要复杂配置,只需要,将SQLite的库文件和动态链接文件拷贝到相应工程目录下,就可以使用SQLite数据库,只是用到数据库基本操作的同学们,建议选择SQLite数据库,为大家介绍一下使用SQLite数据库API函数来实现一些基本操作。

Sqlite应用与嵌入式,应为小巧方便,而且没有其他数据库的复杂配置,我们在写一些小程序或者对数据库不是很复杂的操作的情况下,sqlite是不错的选择 。

我们使用sqlite时需要下下载它的压缩包,网上有很多,

 

解压后,我们可以看到存在 其中我们需要的sqlite3.h和sqlite3.lib以及sqlite3.dll三个文件,接下来我们需要配置我们的编译器(vc6.0或者VS,其步骤都一样)

(1)首先,打开VS编译器,新建WIN32 控制台程序,F7编译,运行(当然什么都没有,目的是得到debug文件)

 

(2)然后我们把已经下载的SQLite3.h,SQLite3.lib拷贝到新建的TestSqlite目录下。然后把sqlite3.h拷贝到debug目录下。其实只要把这几个文件拷贝到程序的目录下即可,到时候我们可以在include中加上路径,同样也能找到。

上面这种加载库文件的方法,有一定弊端(万一我们要引用的文件很多,都拷贝到程序目录下,会很麻烦),第二种方法是使用VS2010编译器所带的功能:我们点击“项目”->“属性”-> 链接器,在附加包含目录里面添加我们所用到的库文件(lib)(输入头文件或者包含文件所在的文件目录),然后在附加库目录里面添加我们用到的库文件的名字(库文件所在的文件目录)。注意添加的时候用逗号隔开(此时我们仍然要把动态链接文件拷贝到程序目录下),这样我们就完成了库文件的加载。方法如下:

(3)

 

 

(4)附加包含目录

 

 

(5)附加依赖项

以上使用第三方库的方法请看如何使用第三方库    http://blog.csdn.net/u014028070/article/details/42278007

  以上方法相当与我们把库文件包含进来,以便调用。然后我们在主程序的头文件中加入如下头文件(sqlite的API函数所在的头文件)。然后我们编译下,检查前面的操作是否正确。

 

此时我们在程序中使用sqliteAPI函数来操作数据库。首先是创建数据库,此时,我们定义一个sqlite操作句柄(以后的打开,插入,执行等动作都是由句柄来执行的),然后定义一个字符指针,和数组,指针用来传递错误信息,数组用来存放我们的sql语句。如图:

 

 

sqlite3_open()函数用来打开一个数据库,若存在,则直接打开,若不存在,则建立一个。

 

运行一下。

此时我们进入程序的目录下,会发现多了一个后缀名为db的文件,这就是我们创建的数据库,右键属性,看到大小为0kb(因为里面没有插入数据)。

 

 

 

此时,我们进行插入数据操作,插入操作首先要建立数据所属的属性(关系数据库的概念),我们在数据库中增加三个属性,分别是sno,sname,sex。分别是整形,动态字符型,字符型。

 

    sqlite3 * conn = NULL;   

    char * err_msg = NULL;  

    char sql[200] = ""  ;  

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

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

    {  

        cout<<"无法打开!";  

    }  

    //创建表 student 创建表以后 不能重复创建    

    sprintf(sql, "CREATE TABLE student_for_table \  

    (sno int, sname varchar(20), age int)");   

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

    {   

        cout<<"操作失败,错误代码: %s"<< err_msg;   

        exit(-1);   

    } 

 

然后我们执行插入操作。(这里只是一个插入数据的演示)

 

int main(int argc, _TCHAR* argv[])  

{  

    sqlite3 * conn = NULL;   

    char * err_msg = NULL;  

    char sql[200] = ""  ;  

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

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

    {  

        cout<<"无法打开!";  

    }  

  

    //创建表 student 创建表以后 不能重复创建    

    sprintf(sql, "CREATE TABLE student_for_table \  

    (sno int, sname varchar(20), age int)");   

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

    {   

    cout<<"操作失败,错误代码: %s"<< err_msg;   

    exit(-1);   

    }   

  

    //表创建完成,插入数据  

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

    {  

        // 执行SQL  

        sprintf(sql, "INSERT INTO student_for_table \  

                     (sno, sname, age) VALUES \  

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

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

        {       

            cout<<"操作失败,错误代码: %s"<< err_msg;       

            exit(-1);   

        }   

    }

然后执行,我们进入程序目录,然后可以看出来数据库的大小已经不是空了。

 

插入数据后,当然我们需要读出来然后显示,所以添加如下代码。

 //把数据读出来,进行显示,sqlite3_exec()执行,调用回调函数,显示的操作写在回填函数中

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

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

 

要读出数据,我们要定义一个回调函数:

//为了数据读出来,使用回调函数  

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

{  

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

    {  

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

    }  

    printf("\n");  

  

    return 0;  

}

 

 以上最后的程序如下:

// TestSqlite.cpp : 定义控制台应用程序的入口点。  
  

#include "stdafx.h"  

#include<iostream>  

#include"sqlite3.h"  

using namespace std;  

#pragma comment(lib,"sqlite3.lib")  

  

//为了数据读出来,使用回调函数  

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

{  

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

    {  

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

    }  

    printf("\n");  

  

    return 0;  

}  

  

int main(int argc, _TCHAR* argv[])  

{  

    sqlite3 * conn = NULL;   

    char * err_msg = NULL;  

    char sql[200] = ""  ;  

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

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

    {  

        cout<<"无法打开!";  

    }  

  

    //创建表 student 创建表以后 不能重复创建    

    sprintf(sql, "CREATE TABLE student_for_table \  

    (sno int, sname varchar(20), age int)");   

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

    {   

    cout<<"操作失败,错误代码: %s"<< err_msg;   

    exit(-1);   

    }   

  

    //表创建完成,插入数据  

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

    {  

        // 执行SQL  

        sprintf(sql, "INSERT INTO student_for_table \  

                     (sno, sname, age) VALUES \  

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

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

        {       

            cout<<"操作失败,错误代码: %s"<< err_msg;       

            exit(-1);   

        }   

    }  

  

    //把数据读出来,进行显示,sqlite3_exec()执行,调用回调函数,显示的操作写在回填函数中  

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

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

  

  

    //操作完数据库后,一定要 关闭连接。  

    if (sqlite3_close(conn) != SQLITE_OK)  

    {  

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

        exit(-1);  

    }  

  

    cout<<"操作成功"<<endl;  

    return 0;  

}  


运行结果如下:

 

 

 

上面演示的是C++如何与sqlite连接,同时我们也可以将mfc与sqlite联合起来使用,做出带界面的操作,其核心的思想是一致的,只是把对sqlite数据库的操作放在不同的响应函数中(mfc以消息传递),比如我们把“打开数据库”操作放在一个button的响应函数中。这样我们就可以做出带有界面的数据库操作程序。这仅是一些简单的操作,要想做出一些有价值的东西,还需要更深的努力。

C++使用SQLite3数据库可以通过SQLite3的C接口来实现。下面是一个简单的示例代码,演示了如何在C++使用SQLite3进行数据库操作: ```cpp #include <iostream> #include <sqlite3.h> int main() { sqlite3* db; int rc = sqlite3_open("test.db", &db); if (rc) { std::cerr << "Cannot open database: " << sqlite3_errmsg(db) << std::endl; return rc; } char* errMsg; rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);", nullptr, nullptr, &errMsg); if (rc != SQLITE_OK) { std::cerr << "SQL error: " << errMsg << std::endl; sqlite3_free(errMsg); return rc; } rc = sqlite3_exec(db, "INSERT INTO users (name, age) VALUES ('John', 25);", nullptr, nullptr, &errMsg); if (rc != SQLITE_OK) { std::cerr << "SQL error: " << errMsg << std::endl; sqlite3_free(errMsg); return rc; } sqlite3_stmt* stmt; rc = sqlite3_prepare_v2(db, "SELECT * FROM users;", -1, &stmt, nullptr); if (rc != SQLITE_OK) { std::cerr << "SQL error: " << sqlite3_errmsg(db) << std::endl; return rc; } while (sqlite3_step(stmt) == SQLITE_ROW) { int id = sqlite3_column_int(stmt, 0); const unsigned char* name = sqlite3_column_text(stmt, 1); int age = sqlite3_column_int(stmt, 2); std::cout << "ID: " << id << ", Name: " << name << ", Age: " << age << std::endl; } sqlite3_finalize(stmt); sqlite3_close(db); return 0; } ``` 上述代码首先打名为"test.db"的数据库文件,如果文件不存在则会创建一个新的数据库文件。然后创建一个名为"users"的表,表中包含id、name和age三个字段。接着插入一条记录,然后查询并输出所有记录的内容。 需要注意的是,上述代码只是一个简单的示例,实际使用时可能需要更多的错误处理和安全性检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值