c - sqlite c api插入绑定(bind)

标签 c sqlite binding sql-insert

我正在尝试使用 sqlite3_bind_* 函数调用在 sqlite DB 中插入值。

这是我正在使用的代码:

#include <stdio.h>
#include "sqlite3.h"
#include <stdlib.h>
#include <string.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
    int i;
    printf("\n callback");
    for (i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main() {

   int rc;
   char *pStrSql,*zErrMsg;
   sqlite3 *db;
   sqlite3_stmt *pInsertStmt;

   int iAge;
   char *pStrName;
   const char *pStrInsSql;

   const char **pzTail;


    rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        exit(0);
    } else {
        fprintf(stdout, "Opened database successfully\n");
    }



    pStrSql = "DROP TABLE employee";
    rc = sqlite3_exec(db, pStrSql, callback, 0, &zErrMsg);

    pStrSql = "CREATE TABLE employee (name text,age int);";

    rc = sqlite3_exec(db, pStrSql, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
       printf("Table created successfully\n");
    }


    pStrInsSql = "INSERT INTO employee VALUES (?,?)";

    rc = sqlite3_prepare_v2(db,pStrInsSql,-1,&pInsertStmt,NULL);
    if( rc != SQLITE_OK) {
        printf("\n Cant prepare Error %s :",sqlite3_errmsg(db));
        exit(0);
    }

    pStrName = "prakash";
    rc = sqlite3_bind_text(pInsertStmt,1,pStrName,-1,SQLITE_TRANSIENT);
     if( rc != SQLITE_OK) {
        printf("\n Cant bind text Error %s :",sqlite3_errmsg(db));
        exit(0);
    }
    iAge = 23;
    rc = sqlite3_bind_int(pInsertStmt,2,iAge);
     if( rc != SQLITE_OK) {
        printf("\n Cant bind int Error %s :",sqlite3_errmsg(db));
        exit(0);
    }

    rc = sqlite3_step(pInsertStmt);
    if( rc != SQLITE_OK) {
        printf("\n Cant execute insert Error %s :",sqlite3_errmsg(db));
        exit(0);
    }

    sqlite3_clear_bindings(pInsertStmt);
    sqlite3_reset(pInsertStmt);
    sqlite3_finalize(pInsertStmt);

    pStrSql = "select * from employee";

    rc = sqlite3_exec(db, pStrSql, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } 

    sqlite3_close(db);

    return 0;
}

调用 sqlite3_step() 后程序失败。 错误消息为“未知错误”。

你能帮我解决这个问题吗? 谢谢 普拉卡什

最佳答案

sqlite3_step()成功时不返回 SQLITE_OK;您必须检查 SQLITE_DONE(以及用于查询的 SQLITE_ROW)。

关于c - sqlite c api插入绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27377683/

相关文章:

c - C中指针和全局变量的位置

无法弄清楚为什么 getchar() 在 C 中第一次出现时选择换行符

mysql - 如何限制 SQLite/MySQL 中的列值

java - Xamarin Android 在 Visual Studio 中绑定(bind)并使用 Java 库

dictionary - 将 SwiftUI Picker 绑定(bind)到字典中保存的值

c - 使用 Linux AIO,能够执行 IO,但也会将垃圾写入文件

c - 通用函数无需 Floor() 即可提取 float 的小数部分

java - Android SQLite 列未找到错误

php - 与 Mysql Sqlite 同步

c# - 在用户控件中公开控件的 itemsource 属性