Sqlite3 c/C++操作入门

  1. 代码里实现的功能就是创建(或者是打开)一个数据库,如果表不存在则添加一个表,在往表里面添加两条记录,然后取出。

  2. #include <iostream>  
  3. #include <conio.h>  
  4.   
  5. #include "sqlite3.h"        // 记得把sqlite3.h 和 sqlite3.cpp加入到工程中来  
  6.   
  7.   
  8. using namespace std;  
  9.   
  10.   
  11. int main()  
  12. {  
  13.     sqlite3* lpdDb = NULL;              // 连接数据库用的一个对象  
  14.     sqlite3_stmt* lpdExcute = NULL;     // 这个对象怎么称呼。。 我也不知道,好像有叫它为事务的,我看了下statement的意思,有指令的意思,就当作是指令(sql就是指令,哈哈)句柄了吧  
  15.     do  
  16.     {  
  17.         // 建立或者打开数据库  
  18.         int liRet = sqlite3_open_v2(  
  19.             "sqltest.db",//NULL,        // 这里指名数据库的名称和存放路径, 如果为空,在磁盘中临时建立一个数据库,当关闭后会自动删除  
  20.             &lpdDb,                     // sqlite3对象指针,后面就全靠这个指针与数据库挂钩了  
  21.             SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,         // 指名打开或者创建这个数据库的一些标记  
  22.             NULL                        // 这个参数文档里说的蛮麻烦的,我没看懂。。。。。。 不过暂时也不需要用。。  
  23.             );  
  24.   
  25.         if( SQLITE_OK != liRet )  
  26.             break;  
  27.   
  28.   
  29.         // 判断表是否存在,不存在则创建它  
  30.         // sql学的很简单,搜了下百度,看不懂那些判断表是否存在的sql语句,所以就用种方式了。。。唉  
  31.         char lscIsExit[] = "select * from stocks";   
  32.           
  33.         // 这个sqlite函数相当于是sql查询工具中的检查器,能够检测sql语句的正确性  
  34.         liRet = sqlite3_prepare_v2(  
  35.             lpdDb,                          // 数据库连接指针  
  36.             lscIsExit,                      // utf-8编码的sql语句  
  37.             sizeof(lscIsExit),              // sql语句的最大长度,字节数  
  38.             &lpdExcute,                     // 指令句柄  
  39.             NULL                            // 最后一个参数是当sql语句没执行完时,能返回的一个指针指向没执行完的部分,基本不用。sql语句没执行完,。。。还能做什么?  
  40.             );  
  41.   
  42.         if(SQLITE_ERROR == liRet)           // sql语句错误或者不存在,创建表  
  43.         {  
  44.             // 创建新的数据表  
  45.             char lscSqlCreate[] = "create table stocks(             \  
  46.                 stockname TEXT not null primary key,                \  
  47.                 stockcode TEXT not null,                            \  
  48.                 exchange TEXT not null,                             \  
  49.                 pyname  TEXT not null                               \  
  50.                 )";  
  51.             liRet = sqlite3_prepare_v2(lpdDb,lscSqlCreate,sizeof(lscSqlCreate),&lpdExcute,NULL);  
  52.             if(SQLITE_ERROR == liRet)  
  53.                 break;  
  54.               
  55.             // 执行sql语句  
  56.             liRet = sqlite3_step(lpdExcute);  
  57.             if(SQLITE_DONE != liRet)        // 执行的是没有返回结果集的sql语句时,返回值是SQLITE_DONE  
  58.                 break;  
  59.             sqlite3_finalize(lpdExcute);    // 这个sql语句的利用结束了,就调用这个函数  
  60.   
  61.   
  62.   
  63.             // 插入新的数据  
  64.             // 这里sql语句里面使用通配符,在后面只需要绑定对应的值就能直接执行sql语句,而不用多次调用sqlite3_prepare_v2函数了  
  65.             // 当然也可以不用通配符,在这里特地使用通配符,练习一下,嘿嘿。  
  66.             char lscInsertValue[] ="insert into stocks(stockname,stockcode,exchange,pyname) values(?,?,?,?)";  
  67.             if(SQLITE_OK != sqlite3_prepare_v2(lpdDb,lscInsertValue,-1,&lpdExcute,NULL))  
  68.                 break;  
  69.               
  70.             // 绑定参数  
  71.             // 注意当存入汉字的时候,应该使用这个函数,而不是sqlite3_bind_text(使用这个函数会失败,即使指定的空间大小是足够的,不知道为什么)  
  72.             // 区别就在于第三个参数和第四个参数。  
  73.             liRet = sqlite3_bind_text16(  
  74.                 lpdExcute,  
  75.                 1,                  // 参数的索引值,最左边的为1  
  76.                 L"大智慧",         // 参数值  
  77.                 -1,//sizeof(L"大智慧"),    // 参数的字节数,如果参数为负数,则遇到第一个结束符时终止  
  78.                 SQLITE_STATIC       // 这个参数当该函数返回失败结果时,对参数值的释放  
  79.                 );  
  80.             if(SQLITE_OK != liRet)break;          
  81.             if(SQLITE_OK != sqlite3_bind_text(lpdExcute,2,"601519",-1,SQLITE_STATIC))break;  
  82.             if(SQLITE_OK != sqlite3_bind_text(lpdExcute,3,"sh",-1,SQLITE_STATIC))break;  
  83.             if(SQLITE_OK != sqlite3_bind_text(lpdExcute,4,"dzh",-1,SQLITE_STATIC))break;  
  84.   
  85.             // 执行sql语句,插入记录  
  86.             if(SQLITE_DONE != sqlite3_step(lpdExcute))break;  
  87.   
  88.             // 之前以为这个函数能将有绑定上的数据清理掉,然后再直接重新绑定就行了,但是发现还是要调用下面那个函数。并且不要这个函数也可以  
  89.             //liRet = sqlite3_clear_bindings(lpdExcute);    
  90.   
  91.             // 这个函数就是使得lpdExcute恢复到刚调用完sqlite3_prepare_v2的状态  
  92.             liRet = sqlite3_reset(lpdExcute);  
  93.   
  94.             // 继续插入一条记录  
  95.             if(SQLITE_OK != sqlite3_bind_text16(lpdExcute,1,L"海马汽车",-1,SQLITE_STATIC))break;  
  96.             if(SQLITE_OK != sqlite3_bind_text(lpdExcute,2,"000572",-1,SQLITE_STATIC))break;  
  97.             if(SQLITE_OK != sqlite3_bind_text(lpdExcute,3,"sz",-1,SQLITE_STATIC))break;  
  98.             if(SQLITE_OK != sqlite3_bind_text(lpdExcute,4,"hmqc",-1,SQLITE_STATIC))break;  
  99.   
  100.             if(SQLITE_DONE != sqlite3_step(lpdExcute))break;  
  101.             sqlite3_finalize(lpdExcute);  
  102.         }  
  103.           
  104.   
  105.         // 查询数据  
  106.         // 这里顺便试了下sqlite3支持的字符串连接方式是oracle的方式,网上搜的。  
  107.         char lscSqlSelect[] = "select stockname,exchange||''||stockcode from stocks";  
  108.         if(SQLITE_OK != sqlite3_prepare_v2(lpdDb,lscSqlSelect,-1,&lpdExcute,NULL))  
  109.             break;  
  110.   
  111.         if(SQLITE_ROW != sqlite3_step(lpdExcute))  
  112.             break;  
  113.   
  114.         int liCountColums = sqlite3_column_count(lpdExcute);  
  115.         if(2 != liCountColums)  
  116.         {  
  117.             cout<<"查询结果集的列数不对"<<endl;  
  118.             break;  
  119.         }  
  120.   
  121.         // 获取列值  
  122.         int i = 0;  
  123.         setlocale(LC_ALL, "chs");       // 使得控制台支持unicode汉字显示  
  124.         do  
  125.         {  
  126.             // 注意第一列是存入unicode,所以用16版本的函数  
  127.             int liCbStockName = sqlite3_column_bytes16(  
  128.                 lpdExcute,  
  129.                 0             
  130.                 );  
  131.             if(0 == liCbStockName)break;  
  132.   
  133.             wchar_t* lswStockName = (wchar_t*)sqlite3_column_text16(lpdExcute,0);  
  134.   
  135.             const unsigned char* lscColumValue= sqlite3_column_text(  
  136.                 lpdExcute,  
  137.                 1           // 列索引  
  138.                 );  
  139.             cout << "CbStockName:"<<liCbStockName<<endl;  
  140.             wcout << lswStockName << "   ";  
  141.             cout << lscColumValue << endl;  
  142.   
  143.         }while(SQLITE_DONE != sqlite3_step(lpdExcute));  
  144.         cout<<endl;  
  145.   
  146.         liRet = sqlite3_finalize(lpdExcute);  
  147.         if(SQLITE_OK != liRet)  
  148.         {  
  149.             cout<< "sqlite3_finalize之前存在错误,错误代码为:"<<liRet <<endl;  
  150.         }  
  151.   
  152.         // 关闭连接  
  153.         while(SQLITE_BUSY == sqlite3_close(lpdDb))  
  154.         {  
  155.             cout<< "不能关闭数据库连接,数据库正在使用中。。。"<<endl;  
  156.             cout<< "按人任意键再次尝试关闭数据库连接"<<endl;  
  157.             _getch();  
  158.         }  
  159.         cout<<"数据库成功关闭。"<<endl;  
  160.           
  161.           
  162.         _getch();  
  163.         return 0;  
  164.     }while(false);  
  165.   
  166.   
  167.     cout<<"出错了,错误代码:"<<sqlite3_errcode(lpdDb)<<"      错误描述:"<<sqlite3_errmsg(lpdDb)<<endl;  
  168.     if(NULL != lpdExcute)  
  169.     {  
  170.         int liRet = sqlite3_finalize(lpdExcute);  
  171.         if(SQLITE_OK != liRet)  
  172.         {  
  173.             cout<< "sqlite3_finalize之前存在错误,错误代码为:"<<liRet <<endl;  
  174.         }  
  175.     }  
  176.     while(SQLITE_BUSY == sqlite3_close(lpdDb))  
  177.     {  
  178.         cout<< "不能关闭数据库连接,数据库正在使用中。。。"<<endl;  
  179.         cout<< "按人任意键再次尝试关闭数据库连接"<<endl;  
  180.         _getch();  
  181.     }  
  182.     cout<<"数据库成功关闭。"<<endl;  
  183.   
  184.     _getch();  
  185.     return 1;  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值