【问题标题】:Data not inserted into the sqlite table c++数据未插入sqlite表c ++
【发布时间】:2013-04-05 22:25:41
【问题描述】:

我正在尝试将映射的键和值的内容保存到数据库表中。 .dbo 文件已创建,但表中没有任何内容。它不会创建表,但不会退出。我想知道我的代码有什么问题。

void names_table( std::map<std::string, unsigned int> &names ){
std::string sql; 
std::string str1;
std::string str2;
std::string str3;

sqlite3_stmt *stmt;
const char *file_names = create_db_file( ); /* default to temp db */
sqlite3 *db;
sqlite3_initialize( );

int rc = sqlite3_open_v2( file_names, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
if ( rc != SQLITE_OK) {
    sqlite3_close( db );
    cout << "Error: Database cannot open!" << endl;
    exit( EXIT_FAILURE);
}
sql = "CREATE TABLE IF NOT EXISTS names_table (offset INTEGER PRIMARY KEY, stname TEXT);";
sqlite3_prepare_v2(db, sql.c_str(), sql.size(), &stmt, NULL);
if (sqlite3_step(stmt) != SQLITE_DONE) cout << "Didn't Create Table!" << endl;

for (auto pm = names.begin(); pm != names.end(); pm++) {
    str2 = "'" + pm->first + "'";
    char tmp[15];
    sprintf(tmp,"%u",pm->second);
    str3 = tmp;
    str1 = (((("INSERT INTO  names_table VALUES(" + str3) + ", ") + str2) + ");");
    std::cout << str1 << std::endl;
    sql = (char *)str1.c_str();
    // stmt = NULL;
    rc = sqlite3_prepare_v2(db, sql.c_str(), sql.size(), &stmt, NULL);
    if ( rc != SQLITE_OK) {
        sqlite3_close(db);
        cout << "Error: Data cannot be inserted!" << endl;
        exit ( EXIT_FAILURE);
    }
}
sqlite3_close( db );

}

【问题讨论】:

  • exit(-1) 不推荐(至少在 C 中)
  • 谢谢大卫。你对错误处理有什么建议?
  • 您的 SQL 语法很可能有一些错误。尝试std::cout &lt;&lt; str1 &lt;&lt; std::endl 并将其粘贴到此处。另外,第二次调用sqlite3_prepare_v2的返回值是多少?
  • @Persianux exit(EXIT_FAILURE)
  • 我为 str1 计算出以下语句之一: INSERT INTO names_table VALUES(ramsar, 8329); rc 的返回值为 0

标签: c++ c database sqlite


【解决方案1】:

INSERT INTO names_table VALUES(ramsar, 8329) - 我希望您知道 SQL 中的字符串文字需要用引号括起来。试试这个:INSERT INTO names_table VALUES('ramsar', 8329)

编辑:实际上,你的代码永远不会做你想做的事,因为你甚至没有在sqlite3_prepare_v2之后调用sqlite3_step,这意味着你只是在编译你的SQL语句,但从不评估它。你从哪里找到这个不好的例子?请参阅herehere 很好的示例,了解如何正确使用 SQLite C++ 接口。

PS:停止在 C++ 中乱用sprintf。你有std::stringstream

【讨论】:

  • 谢谢@Mihai,我很粗心。我也试过了,但这次更正没有任何改变。
  • @Persianux 然后看我上面的评论。
  • 感谢您的 cmets。我阅读了教程并写下了我从中理解的内容。您的 cmets 对我了解如何使用 sqlite 帮助很大。我添加了 sqlite3_step,它无法创建表。我试着弄清楚如何解决它。不过,文件已创建。
  • 我更新了代码。它没有错误。创建 2kb .odb 文件。至少文件不是空的,但在 Openoffice 中我看不到任何表格。该文件显示这一行: SQLite 格式 3######@ ################################# ######################################-�
  • 虽然我找不到任何使用 OpenOffice 的表,但它创建了 13kb .odb 文件 :) 它存储了我想要的数据。谢谢,非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多