C++增删改查sqlite入门

简介:


sqlite小巧好用,功能强大。

C++操作sqlite需要 sqlite3.h,sqlite3.dll,sqlite3.lib
下载 sqlite-dll-win32-x86-3071400.zip sqlite-amalgamation-3071400.zip
前者可以得到sqlite3.dll和sqlite3.def后者可以得到源码sqlite3.h
后面说明如何编译sqlite3.def生成sqlite3.lib
复制代码
#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) "00, &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 ");
}
复制代码

运行时把sqlite3.dll复制到运行目录下。

编译sqlite3.def生成sqlite3.lib
设置环境变量:
PATH:D:\Program Files\vs08\VC\bin 
(我的vc2008安装路径:D:\Program Files\vs08)
进入你的sqlite3.def目录执行:LIB /DEF:sqlite3.def /machine:IX86

如果提示: 没有找到 mspdb80.dll
到D:\Program Files\vs08\Common7\IDE目录下
复制msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe
到D:\Program Files\vs08\VC\bin 
sqlite相关工具参考:
http://greatverve.cnblogs.com/archive/2011/04/28/sqlite-start.html  

url:http://greatverve.cnblogs.com/archive/2012/09/22/cpp-sqlite-start.html





    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/greatverve/archive/2012/09/22/cpp-sqlite-start.html,如需转载请自行联系原作者


相关文章
|
6月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
88 0
|
8月前
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
470 14
|
10月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
9月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
147 2
C++入门12——详解多态1
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
212 1
|
存储 C++ 容器
C++入门9——list的使用
C++入门9——list的使用
153 1
|
C语言 C++ 容器
C++入门7——string类的使用-1
C++入门7——string类的使用-1
108 0
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
245 1