VC与SQLite
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++6.0下初步使用SQLite3
这两天学习了一下,在VC++6.0中如何使用SQLite3,从网上下载的一般都是SQLite3.dll和SQLite3.def文件,而在VC++6.0下还需要使用.lib文件。 所以,我们首先需要自己生成.lib文件。
生成的方法是:
第一步:找到LIB.EXE所在目录
一般都在C:\Program Files\Microsoft Visual Studio\VC98\Bin下(如果VC是装在C盘的话),在“运行”中输入cmd,然后切换到该目录下
第二步:使用LIB命令生成.lib文件
很多网页上都介绍,使用LIB /DEF:sqlite3.def /machine:IX86即可生成,可是我使用它时遇到一些小问题。
这里就不说了,说说应该注意的几点问题吧。第一个,你的sqlite3.def要是没有在C:\Program Files\Microsoft Visual Studio\VC98\Bin下,需要写全路径;第二,为了清楚起见,你需要注明.lib文件的输出路径。下面我给出一个完整的命令行:
C:\Program Files\Microsoft Visual Studio\VC98\Bin>LIB /out:D:\test\sqlite3.lib /MACHINE:IX86 /DEF:D:\test\sqlite3.def
运行完这个命令后,你会在D:\test\下发现sqlite3.lib和sqlite3.exp两个文件。我出的问题就是没有设置/out:D:\test\sqlite3.lib ,导致我运行后,找不到sqlite3.lib和sqlite3.exp这两个文件,即使我整台机器作了搜索!
=================================================================================================================
VC++使用事务来写SQLite3数据库
如果使用VC++使用事务来写SQLite3数据库,首先要先能写库,这篇文章分为两部分,第一部分是怎么来写SQLite3数据库,第二部分怎么使用事务来写库。
第一部分写SQLite3数据库
SQLite官方下载只给了我们一个SQLite3.Dll跟一个SQLite3.def文件,并没有提供用于VC++6使用的Lib文件,因此大家可能要麻烦一点,有两种选择,一种使用Dll动态加载来使用里面的函数,但是这很麻烦,而且如果在程序执行的时候,理论上是有些慢的(因为它每次都要LoadLibrary跟GetProcAddress),如果把所有的函数在程序加载的时候,然后执行的时候就很快了,我推荐大家使用这种方式,但是没有LIB文件怎么办?那咱们就自己做呗~~ ^_^ (我会介绍大部分流行编程语言跟SQLite的接口方法)
<1> VC++ : 启动一个命令行,别说你不会,进入VC的安装目录,我的目录是D:\Microsoft Visual Studio\VC98\Bin 在这个目录下面有一个LIB.exe文件,对,使用它咱们就能制作出咱们需要的SQLite3.lib文件,将咱们在SQLite官方下载的SQLite3.def文件放到相同目录,或者绝对路径也可以, 然后在命令行输入如下命令。
D:\Microsoft Visual Studio\VC98\Bin>LIB /MACHINE:IX86 /DEF:sqlite.def
这样我们就得到了一个SQLite3.lib文件,赶快放到工程链接里面。Project->Settings 在Link选项
卡找到Object/library modules:在最后填入SQLite3.lib 。如果原来就有链接,请使用空格分隔。
将sqlite3.h sqlite3.lib sqlite3.dll文件复制到我们的工程目录,在我们需要写库的CPP文件顶部,填入:#include “sqlite3.h” 然后咱们就可以调用sqlite3.dll里面的所有函数了,比每次都要定义函数原型方便吧?^_^
//Open Sqlite3 database
void OpenSqlite()
{
sqlite3 *sdb;
char buffer[ MAX_PATH] ;
::GetCurrentDirectory( MAX_PATH, buffer );
strcat( buffer, "\\sqlite.db" );
if( SQLITE_OK != sqlite3_open(buffer, &sdb) )
{
::MessageBox( NULL, sqlite3_errmsg(sdb), NULL, MB_OK | MB_ICONERROR );
sqlite3_close( sdb );
exit(1);
return;
}
db=sdb;
}
//Execute SQL statement void execSQL(char* sql)
{
char* zErrMsg = 0;
if( SQLITE_OK != sqlite3_exec(db, sql, 0, 0, &zErrMsg) )
{
::MessageBox( NULL, sqlite3_errmsg(db), NULL, MB_OK | MB_ICONERROR );
sqlite3_close( db );
return;
}
}
程序N简单,不多赘述。之后,我们每次调用这两个函数即可写库了。
PHP调用SQLite3 ,这个不用我多废话,请参看我写的《通过Apache + PHP5 + PDO 连接 SQLite3 数据库》一文
=================================================================================================================
SQLITE3 在VC/MFC 中使用的一点体会
SQLITE简介:
This is an extension for the SQLite Embeddable SQL Database Engine. SQLite is a C library that implements an embeddable SQL database engine. Programs that link with the SQLite library can have SQL database access without running a separate RDBMS process.
SQLite is not a client library used to connect to a big database server. SQLite is the server. The SQLite library reads and writes directly to and from the database files on disk.
在 vc工程目录下 设置 Link L/对象类模块 为 sqlite3.lib
c/c++ 分类 precompiled header 选择不使用预补偿页眉
首先将SQLITE3的七个文件放在和vc工程文件同一目录下
在工程中加入 CppSQLite3DB.cpp和CppSQLite3DB.h文件
# include "CppSQLite3.h"
extern CppSQLite3DB db;/////数据库对象
remove("c:\\test.db");
db.open("c:\\test.db");///打开数据库文件
建立表格:
db.execDML("create table Customer(CustomerName char(50), RoomNumber int, CustomerId int, ComeTime int, Money int);");
db.execDML("create table Room(RoomNumber int, RoomPrice int, RoomState char[20]);");
db.execDML("create table Manager(ManagerName char[20],PassWord int);");
插入数据:
string szCmd;
string szName = m_data1;
szCmd = "insert into Customer values(" ;
szCmd +="'";
szCmd +=szName;
szCmd +="'";
szCmd +=",";
sprintf(a,"%d",m_data2);
szCmd += a;
szCmd += ",";
sprintf(b,"%d",m_data3);
szCmd +=b;
szCmd +=",";
sprintf(c,"%d",m_data4);
szCmd
+= c;
szCmd += ",";
sprintf(d,"%d",m_data5);
szCmd += d;
szCmd += ");";
db.execDML(szCmd.c_str());/////////////插入SQL语句
MessageBox("提交成功,请继续!");
更新数据:
char k[20];//提交后更新房间信息
string szCkd;
szCkd="update Room set RoomState = 'notnull' where RoomNumber=";
sprintf(k, "%d", m_data2);
szCkd +=k;
szCkd +=";";
db.execDML( szCkd.c_str() ); //////////插入SQL语句
查询数据:
CppSQLite3Query q = db.execQuery( "select * from Customer;" );
while( !q.eof() )
{
UpdateData(true);
if(m_data1==q.getIntField(1))
{
s.m_data1 = q.getStringField(0);
s.m_data2 = q.getIntField(1);
s.m_data3 = q.getIntField(2);
s.m_data4 = q.getFloatField(3);
s.m_data5 = q.getIntField(4);
s.DoModal();
UpdateData(false);
break;
}
q.nextRow();
if( q.eof() == true )
MessageBox("本旅馆无该房间!");
}
删除数据:
char a[20];
sprintf(a,"%d",m_data2);
string szCmd;
szCmd="delete from Room where RoomNumber =" ;
szCmd+=a;
szCmd+=";";
int b=0;
b=db.execDML(szCmd.c_str());
if(b==0)
MessageBox("操作错误,没有该房间信息");
else
MessageBox("删除房间信息成功");
==================================================================================================================
下面我们来编写个程序来测试下我们的动态链接库.
在VC下新建一个空的"Win32 Console Application" Win32控制台程序,工程命名为:TestSqliteOnWindows
再新建一个 test.cpp 的C++语言源程序,源代码如下:
// name: test.cpp
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !
// Author : zieckey
// data : 2006/11/28
#include
#include
#include "sqlite3.h"
#define _DEBUG_ //条件编译
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return (1);
}
else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");
//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中
char *sql = " CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
//插入数据
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 23 , 45 , '200605011306', 16.
4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
int nrow = 0, ncolumn = 0; //查询结果集的行数、列数
char **azResult; //二维数组存放结果
//查询数据
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
int i = 0 ;
printf( "row:%d column=%d \n" , nrow , ncolumn );
printf( "\nThe result of querying is : \n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult );
//删除数据
sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
printf( "\n\n\n\nrow:%d column=%d " , nrow , ncolumn );
printf( "\nAfter deleting , the result of querying is : \n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult );
//释放掉 azResult 的内存空间
sqlite3_free_table( azResult );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
sqlite3_close(db); //关闭数据库
return 0;
}