如何更新和选择一个SQL查询

时间:2018-10-02 08:24:05

标签: c++ c sqlite

我具有以下应更新的功能,然后检索表行:

MyEntity setRemoteMyEntityGUIGByMyEntityGUID(long myEntityGUID, long remoteMyEntityGUID) {

    sqlite3 *db = myDb();

    sqlite3_stmt *stmt;

    char *sql = "UPDATE ENTITY_TABLE "
                "SET  REMOTE_ENTITY_GUID = ? " \
                "WHERE ENTITY_GUID = ?; " \
                 "SELECT " \
                 "ENTITY_GUID, " \
                 "ENTITY_TYPE, " \
                 "COLUMN_NAME_UPDATED_DATE " \
                 "FROM ENTITY_TABLE WHERE " \
                 "ENTITY_GUID = ?";

    int rc = sqlite3_prepare(db, sql, -1, &stmt, 0);

    sqlite3_bind_int(stmt, 1, remoteMyEntityGUID);
    sqlite3_bind_int(stmt, 2, myEntityGUID);
    sqlite3_bind_int(stmt, 3, myEntityGUID);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));

        __android_log_print(ANDROID_LOG_ERROR, "MyApp", "ERR : %s", sqlite3_errmsg(db));
    }

    rc = sqlite3_step(stmt);

    MyEntity myEntity;

    if (rc == SQLITE_ROW) {

        myEntityGUID = sqlite3_column_int(stmt, 0);
        char *myEntityType = strdup((const char *) sqlite3_column_text(stmt, 6));
        char *timeUpdated = strdup((const char *) sqlite3_column_text(stmt, 9));

        myEntity._myEntityGUID = myEntityGUID;
        myEntity._myEntityType = myEntityType;
        myEntity._timeUpdated = timeUpdated;

        sqlite3_finalize(stmt);
        sqlite3_close(db);
    }

    return myEntity;
}

但是,它仅执行以下两项之一:更新或检索表行:

char *sql = "UPDATE ENTITY_TABLE "
                "SET  REMOTE_ENTITY_GUID = ? " \
                "WHERE ENTITY_GUID = ?" ;  

OR

char *sql = "SELECT " \
                 "ENTITY_GUID, " \
                 "ENTITY_TYPE, " \
                 "COLUMN_NAME_UPDATED_DATE " \
                 "FROM ENTITY_TABLE WHERE " \
                 "ENTITY_GUID = ?";  

这不会完全起作用,但是第一个(更新)部分将:

char *sql = "UPDATE ENTITY_TABLE "
                "SET  REMOTE_ENTITY_GUID = ? " \
                "WHERE ENTITY_GUID = ?; " \
                 "SELECT " \
                 "ENTITY_GUID, " \
                 "ENTITY_TYPE, " \
                 "COLUMN_NAME_UPDATED_DATE " \
                 "FROM ENTITY_TABLE WHERE " \
                 "ENTITY_GUID = ?";  

我在做什么错?我如何使它工作?

1 个答案:

答案 0 :(得分:1)

因此,由于每个准备好的语句只能使用一个SQL语句,因此必须将其分为两部分:

  • 准备更新语句。
  • 为其绑定任何所需的参数。
  • 使用sqlite3_step()执行它(它返回SQLITE_DONE表示成功或错误代码)。
  • sqlite3_finalize()释放准备好的语句。
  • 准备选择语句。
  • 为其绑定任何所需的参数。
  • 使用sqlite3_step()执行它。
  • 由于看起来您只能退回一行,因此如果sqlite3_step()返回了SQLITE_ROW,请对该行中的选定列进行任何操作。
  • 取消分配准备好的语句。
  • 在所有上述内容中包括适当的错误检查和处理。

(您已经完成了大部分操作;只需要针对两个准备好的语句进行修改即可)

如果准备失败,您还想确保不使用这些语句-在当前代码中,您在甚至检查sqlite3_prepare()的返回值之前都已绑定参数。我还建议改用sqlite3_prepare_v2()-较旧的sqlite3_prepare()引用the documentation,“这是遗留的,应该避免。”