SQLitede3函数API: SQLite Home Page
1.SQLite3_open函数
SQLite3中的sqlite3_open函数是用来打开一个SQLite3数据库文件的函数。它的声明如下:
int sqlite3_open(
const char *filename, /* 数据库文件名 */
sqlite3 **ppDb /* 用于接收打开的数据库连接的指针 */
);
参数解释:
- filename: 要打开的数据库文件的路径和名称。如果文件不存在,则会创建一个新的数据库文件。
- ppDb: 用于接收打开的数据库连接的指针。如果打开成功,ppDb将指向一个sqlite3类型的数据库连接实例。
返回值:
- 如果打开成功,返回SQLITE_OK;否则,返回其他错误码。如果打开失败,可以通过调用sqlite3_errmsg函数来获取详细的错误信息。
示例用法:
#include <sqlite3.h>
int main() {
sqlite3 *db; // 数据库连接
int rc; // 返回码
rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 连接数据库成功后,可以进行其他操作
sqlite3_close(db);
return 0;
}
上述示例代码打开名为"test.db"的数据库文件,并且在打开失败时打印错误信息。请注意,在使用完数据库连接后,需要通过调用sqlite3_close函数( int sqlite3_close(sqlite3*) )来关闭数据库连接。
2.sqlite3_exec函数
在SQLite3中,sqlite3_exec函数用于执行一个或多个SQL语句。
其函数原型如下:
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
参数说明:
- sqlite3*:已打开的数据库对象。
- sql:要执行的SQL语句。
- callback:回调函数,用于处理每一条执行结果。
- void*:给回调函数的第一个参数。
- errmsg:如果有错误发生,错误信息将被写入此指针指向的变量。
sqlite3_exec函数执行指定的SQL语句,并将结果传递给回调函数进行处理。该函数返回一个整数值,表示执行结果,如果返回非零值表示发生了错误。
下面是一个示例:
#include <stdio.h>
#include <sqlite3.h>
int callback(void* data, 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;
rc = sqlite3_open("test.db", &db);
if(rc){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stdout, "Opened database successfully\n");
}
char* sql = "SELECT * FROM COMPANY";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return 0;
}
在上面的示例中,首先使用sqlite3_open函数打开了一个名为test.db的数据库。然后定义了一个SQL语句SELECT * FROM COMPANY来查询数据库中的COMPANY表。接着调用sqlite3_exec函数执行查询,并将结果传递给callback函数进行处理。最后使用sqlite3_close函数关闭数据库连接。
3.实现表格的增删改查
#include <myhead.h>
#include <sqlite3.h>
int flag=0;
typedef struct
{
int gh;
char name[20];
double salary;
}Worker;
int do_insert(sqlite3 *ppDb)
{
Worker work;
printf("请输入插入的工号:");
scanf("%d",&work.gh);
printf("请输入插入的姓名:");
scanf("%s",work.name);
printf("请输入插入的薪水:");
scanf("%lf",&work.salary);
char *errmsg = NULL;//存储错误信息
char sqlite[100]; //插入一个工人信息
snprintf(sqlite,sizeof(sqlite),"insert into Work values(%d,\"%s\",%lf);",work.gh,work.name,work.salary);
if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!=0)//实现插入一个工人信息
{
perror("sqlite3_exec");
printf("错误码:%d错误信息:%s,出错行是:%d\n",
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb),__LINE__);
printf("错误信息:%s\n",errmsg);
return -1;
}
printf("添加工人信息成功\n");
return 0;
}
int callback(void *arg,int n,char **msgtext ,char **msgtable)//回调 输出查找到的工人信息
{
int i,j;
for(i = 0;i<n;i++)//n是列
{
printf("%s\t",*(msgtable+i));
}
printf("\n");
for(j = 0;j<n;j++)
{
printf("%s\t",*(msgtext+j));
}
printf("\n");
printf("查找成功\n");
return 0;
}
int do_reseach(sqlite3 *ppDb)
{
char key[20];
printf("请输入你要查找的工人姓名:");
scanf("%s",key);
char *errmsg = NULL;//存储错误信息
char sqlite[100]; //查找一个工人信息
snprintf(sqlite,sizeof(sqlite),"select * from Work where name==\"%s\";",key);
if(sqlite3_exec(ppDb,sqlite,callback,NULL,&errmsg)!=0)//查找一个工人信息
{
perror("sqlite3_exec");
printf("错误码:%d错误信息:%s,出错行是:%d\n",
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb),__LINE__);
printf("错误信息:%s\n",errmsg);
return -1;
}
return 0;
}
int show_all(void *arg,int n,char **msgtext,char **msgtable)//回调函数显示所有工人信息
{
int i,j;
if(flag==1)
{
for(i = 0;i<n;i++)
{
printf("%s\t",*(msgtable+i));
}
printf("\n");
flag=0;
}
for(j = 0;j<n;j++)
{
printf("%s\t",*(msgtext+j));
if(j%3==2)
{
printf("\n");
}
}
return 0;
}
int do_showall(sqlite3 *ppDb)
{
char *errmsg = NULL;//存储错误信息
char sqlite[100] = "select * from Work"; //输出所有工人信息
if(sqlite3_exec(ppDb,sqlite,show_all,NULL,&errmsg)!=0)//输出所有工人信息
{
perror("sqlite3_exec");
printf("错误码:%d错误信息:%s,出错行是:%d\n",
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb),__LINE__);
printf("错误信息:%s\n",errmsg);
return -1;
}
return 0;
}
int delet_name(sqlite3 *ppDb)
{
char na[20];
printf("请输入要删除工人的姓名:");
scanf("%s",na);
char sqlite[100];
char *errmsg = NULL;//存储错误信息
snprintf(sqlite,sizeof(sqlite),"delete from Work where name=\"%s\";",na);
if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!=0)//
{
perror("sqlite3_exec");
printf("错误码:%d错误信息:%s,出错行是:%d\n",
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb),__LINE__);
printf("错误信息:%s\n",errmsg);
return -1;
}
printf("删除成功\n");
return 0;
}
int updata_salary(sqlite3 *ppDb)
{
char na[20];
double mony;
printf("请输入要修改工人的姓名:");
scanf("%s",na);
printf("请输入要修改的薪水:");
scanf("%lf",&mony);
char sqlite[100];
char *errmsg = NULL;//存储错误信息
snprintf(sqlite,sizeof(sqlite),"update Work set salary=%lf where name=\"%s\";",mony,na);
if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!=0)//
{
perror("sqlite3_exec");
printf("错误码:%d错误信息:%s,出错行是:%d\n",
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb),__LINE__);
printf("错误信息:%s\n",errmsg);
return -1;
}
printf("修改成功\n");
return 0;
}
void mnue(sqlite3 *ppDb)
{
int ch;
printf("\t\t\t***********工人阶级为主导的社会主义国家*****************\n");
printf("\t\t\t1、插入一个工人信息\n");
printf("\t\t\t2、删除一个工人信息\n");
printf("\t\t\t3、修改一个工人信息\n");
printf("\t\t\t4、查找一个工人信息\n");
printf("\t\t\t5、输出所有工人信息\n");
printf("\t\t\t0.退出\n");
printf("请输入你的选择:");
scanf("%d",&ch);
getchar();//吸收回车
switch(ch)
{
case 1:
do_insert(ppDb);//插入一个工人信息
break;
case 2:
delet_name(ppDb);
break;
case 3:
updata_salary(ppDb);
break;
case 4:
do_reseach(ppDb);//查找一个工人信息
break;
case 0:
exit(0);//退出
break;
case 5:
flag=1;
do_showall(ppDb);//输出所有工人信息
printf("查看成功\n");
break;
default:
printf("输入有误,请重新输入\n");
}
}
int main(int argc, const char *argv[])
{
//1、创建或者打开数据库文件
sqlite3 *ppDb;
int k = sqlite3_open("./banzhang.db",&ppDb);//打开或者创建一个数据库
if(k!=SQLITE_OK)
{
perror("sqlite3_open");
printf("错误码:%d错误信息:%s,出错行是:%d\n",
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb),__LINE__);
return -1;
}
printf("数据库打开成功\n");
//2、创建表格
char *errmsg = NULL;//存储错误信息
char sqlite[100] = "create table if not exists Work(gh int,name char,salary double);"; //创建一个表格
if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!=0)
{
perror("sqlite3_exec");
printf("错误码:%d错误信息:%s,出错行是:%d\n",
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb),__LINE__);
printf("错误信息:%s\n",errmsg);
return -1;
}
while(1)
{
mnue(ppDb);//数据库指针作为参数
}
sqlite3_close(ppDb);//关闭数据库文件
return 0;
}
注意功能5的显示另一种写法,采用sqlite3_exec(ppDb,sqlite,show_all,NULL,&errmsg)的第四个参数,设置为flag。因为callback回调函数的第一个参数为sqlite3_exec的第四个参数,因此可以进行传参,但是在回调函数中,需采用强制转换。