学习SQLite遇到的小问题(table Class01 has 3 columns but 4 values were supplied)

在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

最后的结果:

谢谢大家的点赞,有不好的地方可以在评论区说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值