sqlite3(实现表格的增删改查)

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的第四个参数,因此可以进行传参,但是在回调函数中,需采用强制转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值