C语言中使用SQLite3手记

一直想找个嵌入式数据库来用用,几经辛苦,终于了解到有Berkeley DB和SQLite两种很不错的数据库。
在一番衡量之后,决定选用SQLite,毕竟它支持SQL。虽然性能比不上Berkeley DB,但免费小巧,速度快。
再者它支持SQL92标准,可移植性好。BDB虽然很强可以用于工业应用,但由于不是关系数据库,俺担心移植
性问题。
好了,说了一大堆废话,俺到http://www.sqlite.org下载了个Precompiled Binaries For Windows。
解压一看,发现只有一个执行文件sqlite3.exe
查了一下它的用法,发现挺强的,直接sqlite3 xx.db就能创建(如已存在则使用)xx.db为你的数据库。
然后在里面用create table等SQL语句就可操作该DATABASE了。
俺试着创建了一个数据库:
---------------------------------
g:>sqlite\sqlite3 wanna
sqlite> create table hello(
-> id int,
-> name varchar(30)
-> );
sqlite> insert into hello(id,name) values(0,'WanaChan');
sqlite> select * from hello;
0|WannaChan

---------------------------------


可是到了这时候我很疑惑,因为我的目标是要用C或PYTHON来调用SQLITE的API编程的,只有一个EXE
还不够啊!找了很久在http://initd.org/tracker/pysqlite/wiki/pysqlite找到PYTHON的绑定。
但在官方主站找来找去只有TCL的绑定,没有C的,其它地方可找到C++的,但是还是没有C的!
怎么办呢?偶灵机一动,因为它上面有个SOURCE说是PURE C的,于是我把SOURCE下载下来解压,
发现有sqlite3.c sqlite3.h两个文件,于是试着从官方网站COPY个简单的程序来访问它:
------------------------------------
//hello.c
#include <stdio.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}

int main(int argc, char **argv){
sqlite3 *db;
char *zErrMsg = 0;
int rc;

if( argc!=3 ){
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
exit(1);
}

rc = sqlite3_open(arg[1], &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}

rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
------------------------------------

好了,下面尝试来编译它,我用的是MINGW的GCC,试了下面的命令:
-------------------------------------------------------------------------------
G:\sqlite>gcc -I. hello.c -L. -o hello.exe
C:\DOCUME~1\wanna\LOCALS~1\Temp/ccmqbaaa.o(.text+0xc3):hello.c: undefined refere
nce to `sqlite3_open'
C:\DOCUME~1\wanna\LOCALS~1\Temp/ccmqbaaa.o(.text+0xd7):hello.c: undefined refere
nce to `sqlite3_errmsg'
C:\DOCUME~1\wanna\LOCALS~1\Temp/ccmqbaaa.o(.text+0xfe):hello.c: undefined refere
nce to `sqlite3_close'
C:\DOCUME~1\wanna\LOCALS~1\Temp/ccmqbaaa.o(.text+0x13a):hello.c: undefined refer
ence to `sqlite3_exec'
C:\DOCUME~1\wanna\LOCALS~1\Temp/ccmqbaaa.o(.text+0x16d):hello.c: undefined refer
ence to `sqlite3_free'
C:\DOCUME~1\wanna\LOCALS~1\Temp/ccmqbaaa.o(.text+0x178):hello.c: undefined refer
ence to `sqlite3_close'
collect2: ld returned 1 exit status
-------------------------------------------------------------------------------
结果不行!怎么办呢?难道没办法了吗?抱着试试看的态度,我先把源代码编译成DLL看看:
G:\sqlite>gcc -shared -g -o sqlite3.dll sqlite3.c -O3 -s
接下来没有错误信息,是挺漫长的等待,我心情激动地等待着..

几分钟过去了..

HAHA,编译成功!

于是我 gcc -lsqlite3 -I. -L. hello.c -o hello.exe -s
编译又成功,有了个 hello.exe 于是我试试看:
----------------------------------------------
G:\sqlite>hello wanna "select * from hello;"
id = 0
name = WannaChan
----------------------------------------------
HOHO, 成功了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值