【问题标题】:C++ SQLite3 query issue unsolvedC++ SQLite3 查询问题未解决
【发布时间】:2018-09-12 07:02:06
【问题描述】:

我对 SQL 和 C++ 有点陌生。我确实相信我提出的问题会产生一个简单的解决方案。

我必须创建一个 sql 查询以将一些值插入现有表 (const char *sql_query),其中包含混合字符串和浮点值。我的问题是确定字符串汇编操作,而不会出现编译器错误。

这是我的尝试:

int main(int argc, char* argv[])
{
    create_entry("mahut", "topa", "suma", 5.55, 6.66, 7.77);

    return 0;
}

void create_entry(char col1[], char col2[], char col3[], float col4, float col5, float col6)
{
    cout << ("create_entry") << endl;

    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    char *sql;
    char db_name[] = "db_test.db";
    stringstream sql_query;

    // assemble string
    sql_query << "INSERT INTO Department1 (Date,Time,Accept,Factor1,Factor2,Factor3) VALUES ('" << col1 << "','" << col2 << "','" << col3 << "','" << col4 << "','" << col5 << "','" << col6 << "')";
    string str = sql_query.str();

    rc = sqlite3_open(db_name, &db);

    if( rc )
    {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    }
    else
    {
        fprintf(stderr, "Opened database successfully\n");
    }

    // execute SQL statement
    rc = sqlite3_exec(db, str, callback, 0, &zErrMsg);

    if( rc != SQLITE_OK )
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else
    {
        fprintf(stdout, "Records created successfully\n");
    }
    sqlite3_close(db);
}

static int callback(void *db, int argc, char **argv, char **azColName)
{
    cout << "Debug <in callback>" << endl;
    for(int i=0; i<argc; ++i)
    {
        //printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
        cout << ("%s", argv[i] ? argv[i] : "NULL") << endl;
    }
    tbl_exists = true;

    return 0;
}

尤其是我的问题:

sql_query << "INSERT INTO Department1 (Date,Time,Accept,Factor1,Factor2,Factor3) VALUES ('" << col1 << "','" << col2 << "','" << col3 << "','" << col4 << "','" << col5 << "','" << col6 << "')";

我不明白是否有适当的方法将浮点数、整数和字符串混合到 const char * 我不确定出了什么问题,但是就像我说的那样,我已经尝试了很长时间来正确组装该字符串但失败了,因为我只是不掌握 C++ 中的指针和字符串。由于以下错误,编译失败

error: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘const char*’ for argument ‘2’ to ‘int sqlite3_exec(sqlite3*, const char*, int (*)(void*, int, char**, char**), void*, char**)’   rc = sqlite3_exec(db, str, callback, 0, &zErrMsg);

我也收到以下警告

warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

【问题讨论】:

  • 摆脱char[],改用std::string,看着你的问题消失
  • 你指的是函数参数吗?像这样 void create_entry(std::string col1, std::string col2, std::string col3, float col4, float col5, float col6)??
  • 是的,我指的是char[]的用法
  • 仍然收到该错误错误:无法将参数 '2' 的 'std::__cxx11::string {aka std::__cxx11::basic_string}' 转换为 'const char*' 到'int sqlite3_exec(sqlite3*, const char*, int ()(void, int, char**, char**), void*, char**)' rc = sqlite3_exec(db, str , 回调, 0, &zErrMsg);

标签: c++ sql sqlite


【解决方案1】:

对于您的错误,您缺少将 std::string 转换为 C 样式字符串的 .c_str() 转换。 sqlite3_exec 采用 C 风格的 const char * 字符串,而不是 C++ 字符串。

对于您的警告,您需要将create_entry() 的参数声明为const char *(或const char []) - 因为它们是文字(不应修改的常量)。将它们声明为非 const 会使您意外修改它们。

【讨论】:

  • 是的,我明白了,我的问题是如何将我的所有值放入 (const char *sql_query)?这些是我想要的值: ("mahut", "topa", "suma", 5.55, 6.66, 7.77)) 到以下行:“INSERT INTO Department1 (Date,Time,Accept,Factor1,Factor2,Factor3 ) 值 (%s, %s, %s, %f, %f, %f)", col1, col2, col3, col4, col5, col6); //---------------------------- 我该怎么做?
  • 你在 std::stringstream 的正确轨道上。如果你做 cout
  • 输出:INSERT INTO Department1 (Date,Time,Accept,Factor1,Factor2,Factor3) VALUES ('mahut','topa','suma','5.55','6.66',' 7.77') 但是在编译和尝试执行查询时我仍然收到该错误:错误:无法将 'std::__cxx11::string {aka std::__cxx11::basic_string}' 转换为 'const char*'对于参数 '2' 到 'int sqlite3_exec(sqlite3*, const char*, int ()(void, int, char**, char**), void*, char**)' rc = sqlite3_exec(db, str, 回调, 0, &zErrMsg);
  • 参见上面的答案:你在 str 之后缺少 .c_str() 来将 std::string 转换为 c 风格的 "const char *" 字符串。
  • 我有这一行:string str = sql_query.str();然后我执行查询: rc = sqlite3_exec(db, str, callback, 0, &zErrMsg);
【解决方案2】:

如果你根本不做,组装字符串会变得更容易:

void create_entry(const char col1[], const char col2[], const char col3[],
                  float col4, float col5, float col6)
{
    sqlite3 *db;
    int rc;
    const char *sql;
    static const char db_name[] = "db_test.db";
    sqlite3_stmt *stmt;

    sql = "INSERT INTO Department1 (Date,Time,Accept,Factor1,Factor2,Factor3)"
          " VALUES (?,?,?,?,?,?)";

    rc = sqlite3_open(db_name, &db);
    if( rc != SQLITE_OK )
    {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return;
    }

    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if( rc != SQLITE_OK )
    {
        fprintf(stderr, "Can't prepare query: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return;
    }

    sqlite3_bind_text(stmt, 1, col1, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 2, col2, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 3, col3, -1, SQLITE_STATIC);
    sqlite3_bind_double(stmt, 4, col4);
    sqlite3_bind_double(stmt, 5, col5);
    sqlite3_bind_double(stmt, 6, col6);

    rc = sqlite3_step(stmt);
    if( rc != SQLITE_DONE )
    {
        fprintf(stderr, "Can't execute query: %s\n", sqlite3_errmsg(db));
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return;
    }

    sqlite3_finalize(stmt);
    sqlite3_close(db);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2022-10-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多