1

我的 DataBase.cpp 文件中的代码:

#include "DataBase.h"
#include <sqlite3.h>
#include <string.h>
#include <wx/msgdlg.h>
bool CanClose(void)
{
    sqlite3 *Sqlite;
    sqlite3_stmt *sqlstmt;
    char *result;
    if(sqlite3_open("SysConfig",&Sqlite)==SQLITE_OK)
    {
       sqlite3_prepare(Sqlite,"SELECT config_value FROM configuration WHERE config_id = 1;",-1,&sqlstmt,NULL);
       sqlite3_step(sqlstmt);
       result = (char*)sqlite3_column_text(sqlstmt,0);
       sqlite3_close(Sqlite);
       if(strcmp(result,"YES")==1)    //Error Here
           return true;
       else
           return false;
    }
    else
    {
        wxMessageBox(_("Cannot Find System File!"),_("Error!"));
        sqlite3_close(Sqlite);
        return false;
    }
}

我的程序表现得很突然。当我尝试调试它时,上面指示的行(第 19 行)给出了一些错误:

程序收到信号 SIGSEGV,分段错误。

语句的进一步反汇编在汇编指令中显示错误

call 0x80500b0

知道代码有什么问题吗?

4

1 回答 1

4

段错误的原因

sqlite3 文档sqlite3_column_text说:

如果这些例程中的任何一个在sqlite3_step()返回除 之外的内容后被调用 [...] SQLITE_ROW,则结果未定义。”

您没有检查 的返回值sqlite3_step,因此您的查询似乎返回了某种错误,然后sqlite3_column_text返回了无效指针。

调试 SQL 错误

根据以下文档prepare

所有新程序都推荐使用和sqlite3_prepare_v2()接口。sqlite3_prepare16_v2()为了向后兼容,保留了两个较旧的接口 [包括sqlite3_prepare您所称的 ],但不鼓励使用它们。

[...]

发生错误时, sqlite3_step() 将返回详细错误代码或扩展错误代码之一。遗留行为是 sqlite3_step() 只会返回通用 SQLITE_ERROR 结果代码,并且应用程序必须再次调用 sqlite3_reset() 才能找到问题的根本原因。使用“v2”准备接口,错误的根本原因会立即返回。

因此,如果您切换到较新的界面,它应该会提供更丰富的信息,而不是通用的SQLITE_ERROR.

您也可以尝试使用sqlite3命令行程序,它会直接告诉您错误是什么。示例会话:

user@host:/path$ sqlite3 test.sqlite
sqlite> create table example ( id numeric primary key );
sqlite> select bogus from example;
Error: no such column: bogus

顺便说一句,对于标准 C++ 使用#include <cstring>for#include <string.h>bool CanClose()for bool CanClose(void)

于 2012-12-22T21:20:18.670 回答