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, 成功了!

你可能感兴趣的:(C++,c,sqlite,python,C#)