【发布时间】: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);