当前位置:文档之家› VC与SQLite

VC与SQLite

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;
}


相关主题
文本预览
相关文档 最新文档