C - SQLite 绑定(bind)不工作

标签 c sqlite

str我有这段代码应该插入到 SQLite3 数据库中,但是我试图绑定(bind)的两列都插入了空白值。我试过只使用 sprintf 将值直接放入 sql 语句中,但这会产生段错误。如果我能在这里得到任何帮助,我将不胜感激。

   /* libsensordata.c */
    #include <stdio.h>
    #include <sqlite3.h>

    int insert_data (char *sensor, double temp)
    {
            sqlite3 *db;
            char *err_msg = 0;
            sqlite3_stmt *res;

            int rc = sqlite3_open("ap.db", &db);

            if (rc != SQLITE_OK) {

                    fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
                    sqlite3_close(db);

                    return -1;
            }

            char *sql = "insert INTO sensordata (sensor, temp, t, processed) values (@sensor,@temp,DateTime('now'),0)";

            rc = sqlite3_prepare_v2(db,sql, -1, &res, 0);

            if  ( rc == SQLITE_OK) {

                    int idx = sqlite3_bind_parameter_index(res, "@sensor");
                    sqlite3_bind_text(res,idx,sensor,strlen(sensor),SQLITE_TRANSIENT);
                    idx = sqlite3_bind_parameter_index(res, "@temp");
                    sqlite3_bind_double(res,idx,temp);

            }
            else {

                    fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
                    sqlite3_close(db);
                    return -1;
            }

            rc = sqlite3_exec(db, sql, 0, 0, &err_msg);

            if (rc != SQLITE_OK ) {

                    fprintf(stderr, "SQL error: %s\n", err_msg);

                    sqlite3_free(err_msg);
                    sqlite3_close(db);

                    return -1;
            }

            sqlite3_close(db);

            return 0;
    }

    /* Test database testdb.c */
    #include "libsensordata.h"

    int main()
    {
            insert_data("1234567890123456789012345",-17.0);
            return 0;
    }

最佳答案

您正在使用 sqlite3_exec它只是执行 SQL 语句

insert INTO 
    sensordata (sensor, temp, t, processed) 
    values (@sensor,@temp,DateTime('now'),0)` 

在没有任何绑定(bind)值的情况下插入语句(插入空值)。

您需要调用sqlite3_step ,这将执行作为参数传递的准备好的语句(res 在您的代码中)。

你必须替换这一行:

 rc = sqlite3_exec(db, sql, 0, 0, &err_msg);

用这个:

 rc = sqlite3_step(res);

让您的代码执行所需的插入

关于C - SQLite 绑定(bind)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182653/

相关文章:

java - Google App Engine 上的 SQLite

objective-c - 如何解决 Error calling sqlite3_step (21 : out of memory) rs in FMDB

c - 如何将标量合并为 vector 而不编译器浪费指令将上元素归零?英特尔内在函数的设计限制?

c - open() 函数参数

C 函数删除字符串中的元音不起作用?

android - 从 fragment 中的 sqlite 动态设置复选框

c - 如何从每个元素需要不同字节长度的外部二进制文件中读取数据?

c - 添加对指针的操作

java - Android限制一个用户的注册

c++ - 在 C++ 中使用 sqlite3 时内存泄漏