【问题标题】:Cannot Delete Record From SQLite3 Table无法从 SQLite3 表中删除记录
【发布时间】:2014-02-21 06:37:45
【问题描述】:

让我从我用来从表中删除记录的代码开始:

dData("Player_Data", bErrors);

调用函数,传递表名和一个布尔值来判断是否有错误。功能:

void Database::dData(string table, bool* bErrors)
{
    sqlStr2 = "Delete From " + table;

    sqlite3_exec(dBase,"BEGIN TRANSACTION",NULL,NULL,&error);

    if (sqlite3_prepare_v2(dBase, sqlStr2.c_str(), sqlStr2.size(), &statement2, 0) == SQLITE_OK)
    {           
        sqlite3_step(statement2);
        *bErrors = false;

        finalize(statement2, bErrors);
    }

    else
    {
        *bErrors = true;
        createBInfo();      
        d.createBReport("SQL Code 3",sqlite3_errmsg(dBase),bLocale + to_string(__LINE__),bTDate,"./SC_Log.txt");
    }

    sqlite3_exec(dBase,"END TRANSACTION",NULL,NULL,&error);
}

我最初将删除查询作为“删除自”+ 表。这未能删除记录,因此我根据 SO 上类似问题的建议答案将其更改为 Delete * From。

无论我尝试什么,我都无法删除 Player_Data 表中的单个记录。 Player_Data 的删除查询也没有产生错误 顶部标签中的代码导致记录语法错误;回到正确的语法并没有改变这种情况。

SQLite 是否会阻止您从 c/c++ 接口删除表中的最后一条记录?

【问题讨论】:

    标签: c++ sqlite delete-row


    【解决方案1】:

    您的代码非常复杂。您可以通过使用以下示例代码来简化这一点,使用以下模板修改您的东西,我认为它会起作用....

    void Database::dData(string table, bool* bErrors)
    {
        NSString *tableName = [NSString stringWithUTF8String:table];
        NSString *qsql = [NSString stringWithFormat:@"DELETE FROM %@", tableName];
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2( database_object, [qsql UTF8String], -1, &statement, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(statement) == SQLITE_DONE)
            {
                NSLog(@"%@", @"deleted");
            }
        }
        else 
        {
             sqlite3_close(db);
             NSAssert(0, @"Failed to Delete");
        }
        sqlite3_finalize(statement);
    }
    

    只需修改这些东西,我认为它对你有用......

    【讨论】:

      【解决方案2】:

      好的,我已经解决了这个问题;这是一个问题。因此,为了快速总结问题,总结一下正在发生的事情是我试图从表中删除数据以更新该数据。但是,执行此操作的功能没有产生预期的结果;没有数据被删除,并且该函数中的 sql 代码没有产生明显的错误。

      加入 SQLite3 新闻组并在那里发布问题后,我们对其进行了跟踪。发生的事情是我的开始/提交本身出错了,而我没有发现这些错误。

      新闻组的 Kees Nuyt 建议捕获并打印我们的错误以查看是否有任何错误。当我这样做时,我发现 by being 语句抛出了一个数据库锁定错误。反复几次之后,当我意识到这段代码在我开始新游戏时有效,但在加载旧游戏时无效。

      我在我的 dataSystem 类(我的数据从中加载)的 lData 中进行了一些繁重的调试检查(逐行),并发现从一开始就存在未完成的语句不允许数据库将被关闭。

      这是我们开始解决问题的地方。导致此问题的三个问题:

      1. 我在 lData 中的代码引起了问题,因为我的 openDB 函数调用位于一个即使不需要关闭数据库也会被调用的地方(它们之所以需要是因为我需要打开我的 scDatabase .sqlite 文件来获取加载过程的某些类型的数据)。

      2. 我在数据库中的 getxResults 函数中的 finalize 语句处于如果出现问题时不会被调用的位置。

      3. 除了我的 getRows 函数外,与上面相同,它有多个返回向量。

      为了解决这个问题,我必须解决所有这些问题。一旦所有东西都移动到需要去的地方,删除自的问题就没有了,其他一直困扰我的游戏的错误也得到了修复。

      【讨论】:

        猜你喜欢
        • 2014-10-16
        • 1970-01-01
        • 2018-07-15
        • 2017-05-01
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多