C++ SQLite3 查询问题未解决
C++ SQLite3 query issue unsolved
我对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: %sn", sqlite3_errmsg(db));
}
else
{
fprintf(stderr, "Opened database successfullyn");
}
// execute SQL statement
rc = sqlite3_exec(db, str, callback, 0, &zErrMsg);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %sn", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
fprintf(stdout, "Records created successfullyn");
}
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 = %sn", 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]
对于您的错误,您缺少 std::string 到 C 样式字符串的.c_str()
转换。 sqlite3_exec采用 C 样式的const char *
字符串,而不是C++字符串。
对于警告,您需要将参数声明为create_entry()
const char *
(或const char []
) - 因为它们是文字(不应修改的常量)。 将它们声明为非常量会让您意外修改它们。
如果您根本不这样做,则组装字符串会变得更容易:
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: %sn", sqlite3_errmsg(db));
return;
}
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if( rc != SQLITE_OK )
{
fprintf(stderr, "Can't prepare query: %sn", 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: %sn", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
}
相关文章:
- 节俭并发:未解决的外部问题
- 未解决的外部链接问题
- C++ SQLite3 查询问题未解决
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- 为使用boost的预开发库构建c++包装器时未解决的外部问题
- 另一个与未解决符号相关的问题
- 伊利希特中未解决的外部问题
- 未解决的符号问题
- VS2013与QT5.3.2使用Websocket,并得到一个未解决的外部符号问题
- 在Visual Studio 2013中尝试使用C++连接到mysql时未解决的外部问题
- 格鲁问题,未解决的外部问题
- 带有 OO 的模板导致未解决的外部符号问题
- 对"pthread_key_create"的未定义引用;参数顺序不能解决问题
- 编译多源文件时未解决的外部问题
- 为什么我的程序总是得到未解决的外部问题
- TinyXml未解决的外部问题
- 未解决的外部符号(已经阅读了类似的问题,但没有运气)
- c++ EDITTEXT和DIRECTSHOW PAUSE()中未解决的问题
- MS Detours 2.1-未解决的外部问题
- 链接器错误:未解决的外部符号问题