设为首页 收藏本站
查看: 1583|回复: 0

[经验分享] SQLITE的C语言接口

[复制链接]

尚未签到

发表于 2016-11-29 06:28:28 | 显示全部楼层 |阅读模式
近我正在Linux平台写一个软件,需要用到一个简单的数据库。mysql做数据库固然很好,但其数据是存放在服务器的。我想要的基本功能也就是使用C程序创建一个数据库本地文件,然后可以对这个数据库文件执行基本的sql操作. 就像在Windows平台基于VC6.0的DAO数据库编程一样(创建一个本地文件.mdb).  从网上找到了一个开源免费的数据库开发工具--sqlite, 网上的关于sqlite的介绍有很多,详细见官方网站:http://www.sqlite.com.cn/. 我发现sqlite正是我需要的. 总结一下几个特点:
1. 开放源代码
2. 程序特别小,在windows下应用程序sqlite.exe仅仅200kb以内。
3. 支持大多数sql指令,速度极快
4. 直接创建一个xxx.db, 就是一个数据库,不需要服务器支持
5. 简洁的C语言API接口
  基于上面几点,足可以看出sqlite的强大和优异之处。源代码公开和程序特别小,甚至可以跨平台直接编译"gcc -o sqlite3 *",将这融合到潜入式系统是多么的美妙!
  在ubuntu6.10平台安装sqlite3及其开发包:
#sudo apt-get install sqlite3 libsqlite3-dev
  链接这篇文章介绍了sqlite的使用方法:
http://www.sqlite.com.cn/MySqlite/4/378.Html
  下面是我总结的sqlite3与C接口的API
我用到的主要是下面几个函数(头文件sqlite3.h):
int sqlite3_open(const char*, sqlite3**); //打开一个数据库
int sqlite3_close(sqlite3*); //关闭
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);//执行
int sqlite3_get_table(sqlite3*, const char *sql,char***result, int *nrow,int *ncolumn ,char **errmsg );
//result中是以数组的形式存放所查询的数据,首先是表名,再是数据;
//nrow/ncolumn分别为查询语句返回的结果集的行数/列数,没有查到结果时返回0
sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.
sqlite3_errmsg() 则用来得到这些错误代码所对应的文字说明.

exec错误码
#define SQLITE_OK 0 /* Successful result */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* An internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* (Internal Only) Table or record not found */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT 19 /* Abort due to contraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_ROW 100 /* sqlite_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite_step() has finished executing */
应用实例:
  定义
sqlite3 *db = NULL;
char * errMsg = NULL;
char sql_cmd[200];
  打开文件:
int rc = sqlite3_open("xxx.db", &db);
if(rc) //打开失败
printf("Open database failed!\n");
else
printf("create the database successful!\n");
  建立表格:
sprintf(sql_cmd,"CREATE TABLE datapro(package INTEGER,offset \
INTEGER,lklen INTEGER,base INTEHER,link INTEGER,err INTEGER);");
rc=sqlite3_exec(db,sql_cmd,0,0,&eMsg); //建立表datapro
if(rc==SQLITE_OK) //建表成功
printf("create the chn_to_eng table successful!\n");
else
printf("%s\n",eMsg);
添加数据:
sprintf(sql_cmd,"INSERT INTO datapro VALUES(%d,%d,%d,%d,%d,%d);",4,2345,268,9,3,3);
rc=sqlite3_exec(pro_db,pro_sqlcmd,0,0,&eMsg);
  查询:
int nrow=0, ncolumn=0;
char **azResult; //存放结果
sql="SELECT * FROM datapro";
sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&eMsg);
//其中nrow为行数,ncolum为列数
printf("\nThe result of querying is : \n");
for(int i=1;i<nrow+1;i++)
{
for(int j=0;j<ncolumn;j++)
printf("%s ",azResult[i*ncolumn+j]);
printf("\n");
}
  删除:
sprintf(sql_cmd,"DELETE FROM datapro WHERE package=1;") ;
rc=sqlite3_exec(db,sql,0,0,&eMsg);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306792-1-1.html 上篇帖子: SQLite优化建议 下篇帖子: sqlite语句标准
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表