在SQL编程用C语言建表以及插入数据的过程中可能会遇到这样的问题:
这种情况表示我们原来所设定的时候一行只有三个字段数,但是我们却输入了四个,所以这就导致我们创建完表格后却插入不了数据的原因,想要解决这个问题有两个方法:
方法一:修改我们想要输入的字段数,使其与设定的数目相符
ret = sqlite3_exec(db,"create table Class01(id Integer,name char,score Integer);",callback,"contend of sql",&errorMes); //设定的式子
//自己想要的式子
ret = sqlite3_exec(db,"insert into Class01 values(112,'huang',99,'m');",callback,"contend of sql",&errorMes); //修改前
ret = sqlite3_exec(db,"insert into Class01 values(112,'huang',99);",callback,"contend of sql",&errorMes); //修改后
方法二:修改设定字段数的数目,使其与我们想要输入的字段数相符
const char *sql_create_table = "CREATE TABLE IF NOT EXISTS Class01(id INTEGER PRIMARY KEY, name TEXT, score INTEGER, sex TEXT);"; //自己设定的字段数以及字段内容
ret = sqlite3_exec(db, "INSERT INTO Class01 VALUES (112, 'huang', 99, 'm');", callback, "content of sql", &errorMes); //填写自己想要的字段内容
例子:
#include <stdio.h>
#include <sqlite3.h>
int callback(void *arg, int column_size, char **column_value, char **column_name) {
int i;
printf("arg=%s\n", (char *)arg);
for (i = 0; i < column_size; i++) {
printf("%s = %s\n", column_name[i], column_value[i]);
}
printf("==================================\n");
return 0;
}
int main(int argc, char **argv) {
sqlite3 *db;
char *errorMes = NULL;
int ret;
if (argc < 2) {
printf("Usage: %s xxx.db\n", argv[0]);
return -1;
}
if ((ret = sqlite3_open(argv[1], &db)) == SQLITE_OK) {
printf("open %s success\n", argv[1]);
} else {
printf("ERROR: %s, %d\n", sqlite3_errmsg(db), ret);
if (ret == SQLITE_PERM) {
printf("permission denied\n");
}
return -1;
}
const char *sql_create_table = "CREATE TABLE IF NOT EXISTS Class01(id INTEGER PRIMARY KEY, name TEXT, score INTEGER, sex TEXT);";
ret = sqlite3_exec(db, sql_create_table, callback, "creating table", &errorMes);
if (ret != SQLITE_OK) {
printf("create table error: %s\n", errorMes);
sqlite3_free(errorMes);
errorMes = NULL; // Prevent double free
}
const char *sql_drop_table = "DROP TABLE IF EXISTS Class01;";
ret = sqlite3_exec(db, sql_drop_table, callback, "dropping table", &errorMes);
if (ret != SQLITE_OK) {
printf("drop table error: %s\n", errorMes);
sqlite3_free(errorMes);
errorMes = NULL; // Prevent double free
}
// Recreate table after dropping it
ret = sqlite3_exec(db, sql_create_table, callback, "creating table", &errorMes);
if (ret != SQLITE_OK) {
printf("create table error: %s\n", errorMes);
sqlite3_free(errorMes);
}
ret = sqlite3_exec(db, "INSERT INTO Class01 VALUES (112, 'huang', 99, 'm');", callback, "content of sql", &errorMes);
if (ret != SQLITE_OK) {
printf("insert error: %s\n", errorMes);
sqlite3_free(errorMes);
}
ret = sqlite3_exec(db, "SELECT * FROM Class01;", callback, "content of sql", &errorMes);
if (ret != SQLITE_OK) {
printf("select error: %s\n", errorMes);
sqlite3_free(errorMes);
}
sqlite3_close(db);
printf("done\n");
return 0;
}
输入以下指令经行编译执行
gcc createSqlite.c -lsqlite3
./a.out test.db
最后的结果:
谢谢大家的点赞,有不好的地方可以在评论区说明