数据库操作 ——sqlite3_exec

本文介绍了一个使用C语言实现的SQLite数据库操作实例,包括创建表、插入数据、更新记录及查询特定条件的数据等基本功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <sqlite3.h>


int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
//para是你在 sqlite3_exec 里传入的 void * 参数 //通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),然后在这里面强制转换成对应的类型(这里面是void*类型,必须强制转换成你的类型才可用)。然后操作这些数据
// n_column是这一条记录有多少个字段 (即这条记录有多少列)
// char ** column_value 是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组),每一个元素都是一个 char * 值,是一个字段内容(用字符串来表示,以/0结尾)
//char ** column_name 跟 column_value是对应的,表示这个字段的字段名称
//这里,我不使用 para 参数。忽略它的存在.  
int i;
for (i = 0; i < n_column; i++)
{
printf ("%8s : %-8s ", column_name[i], column_value[i]);
}

printf ("\n");
return 0;
}


int main()
{
sqlite3 * db = NULL;
    
int result = sqlite3_open("student.db", &db);
if (result != SQLITE_OK)
{
   printf ("1open student.db error!\n");
return -1;
}


char *errmsg;
result = sqlite3_exec(db, "create table test(ID INTEGER, name TEXT, sex TEXT, age INTEGER, primary key(ID))", NULL, NULL, &errmsg);
if (result != SQLITE_OK && result != 1)
{
   printf ("create test table error : %d(%s)!\n", result, errmsg);
return -1;
}

/* int id;
char name[20];
char sex[20];
int age;
printf ("please insert a record\n");
printf ("please input ID:");
scanf ("%d", &id);
printf ("please input name:");
scanf ("%s", name);
printf ("please input sex:");
scanf ("%s", sex);
printf ("please input age:");
scanf ("%d", &age);
char buff[200]; */

/* result = sqlite3_exec(db, "update test set age=90 where name='Zhang'", NULL, NULL, &errmsg);
if (result != SQLITE_OK)
{
   printf ("insert test table error : %d(%s)!\n", result, errmsg);
//return -1;
} */
sprintf (buff, "insert into test values(%d,'%s', '%s', %d)", id, name, sex, age);
result = sqlite3_exec(db, buff, NULL, NULL, &errmsg);
if (result != SQLITE_OK)
{
   printf ("insert test table error : %d(%s)!\n", result, errmsg);
return -1;


result = sqlite3_exec(db, "select ID,name from test where sex='F'", LoadMyInfo, NULL, &errmsg);
if (result != SQLITE_OK)
{
   printf ("insert select table error : %d(%s)!\n", result, errmsg);
return -1;


sqlite3_close(db);
return 0;
}
### 正确使用 `sqlite_exec` 函数 #### 函数概述 `sqlite_exec` 是 SQLite 库中用于执行 SQL 命令的一个重要接口。该函数允许一次性执行多条 SQL 语句,并支持通过回调机制处理查询结果。 #### 参数详解 - **第一个参数 (`sqlite3* db`)**:指向已打开的数据库连接对象。 - **第二个参数 (`const char *sql`)**:要执行的一条或多条 SQL 语句字符串,采用 UTF-8 编码[^1]。 - **第三个参数 (`int (*callback)(void*,int,char**,char**)`)**:可选的回调函数指针,在每次有新行被读取时调用。如果不需要处理每一行的结果,则可以传递 NULL。 - **第四个参数 (`void *arg`)**:作为额外的数据传递给回调函数的第一个参数。 - **第五个参数 (`char **errmsg`)**:用来存储错误消息地址的指针,当发生错误时会被设置成描述性的错误信息文本[^4]。 #### 返回值解释 成功返回 SQLITE_OK (0),失败则返回其他非零整数值,具体的错误代码可以在头文件 sqlite3.h 中找到相应的宏定义[^2]。 #### 使用示例 下面是一个简单的 C++ 示例程序展示如何利用 `sqlite_exec` 来创建表并插入数据: ```cpp #include <iostream> #include <sqlite3.h> // 定义一个简单的回调函数打印每列的内容 static int callback(void *NotUsed, int argc, char **argv, char **azColName){ for(int i=0; i<argc; i++){ std::cout << azColName[i] << " = " << (argv[i]?argv[i]:"NULL") << "\n"; } std::cout << "\n"; return 0; } int main(){ sqlite3 *db; char *zErrMsg = nullptr; int rc; // 打开/创建数据库文件 test.db rc = sqlite3_open("test.db", &db); if(rc != SQLITE_OK ){ fprintf(stderr,"Can&#39;t open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } // 创建表格命令 const char* createTableCmd = "CREATE TABLE COMPANY(" "ID INT PRIMARY KEY NOT NULL," "NAME TEXT NOT NULL);"; // 插入记录命令 const char* insertRecordCmd = "INSERT INTO COMPANY (ID, NAME) VALUES (1, &#39;Paul&#39;);" "INSERT INTO COMPANY (ID, NAME) VALUES (2, &#39;Allen&#39;);"; // 查询所有记录命令 const char* selectAllRecordsCmd = "SELECT * FROM COMPANY;"; // 执行创建表的操作 rc = sqlite3_exec(db, createTableCmd, nullptr, nullptr, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { printf("Table created successfully\n"); } // 执行插入操作 rc = sqlite3_exec(db, insertRecordCmd, nullptr, nullptr, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { printf("Records inserted successfully\n"); } // 执行查询操作,并指定回调函数显示结果集 rc = sqlite3_exec(db, selectAllRecordsCmd, callback, nullptr, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { printf("Operation done successfully\n"); } // 关闭数据库连接 sqlite3_close(db); } ``` 上述例子展示了完整的流程——从初始化到关闭整个过程都包含了必要的异常处理逻辑,确保即使出现问题也能得到妥善解决[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值