sqlite C API,UDATE数据库

时间:2012-10-26 15:17:54

标签: c++ sql database api sqlite

我正在开发一种在我已经拥有的程序中创建编辑窗口的方法,该方法访问一个Sqlite数据库,该数据库已设置并包含4个信息,条目的id,条目的名称(是用户指定的),文件位置(也是用户输入的)和组的成员。 在编辑窗口中,有两个标签,名称的文本输入框和打开文件浏览器的按钮。 我的问题是当我在添加新窗口中设置sql数据库时,所有数据都在数据库中设置,虽然当我想从数据库中编辑数据时,我当前删除旧数据然后添加新数据,虽然查看了在线文档我找到了一个UPDATE方法,虽然这样可以更好地工作,但无法以某种方式获取数据库的正确索引,我如何调用索引3,我收到错误

Unhandled exception at 0x01143622 in bv.exe: 0xC0000005: Access violation reading location 0x00000000.
经过一些研究后我发现这是由一个NULL引用指针引起的,我找到的唯一原因是该字段为空,但我在添加窗口中清楚地设置了它。 请帮忙:(

std::string campaign_sql("SELECT id, name, config, members FROM bv_campaigns");

sqlite3_stmt *prepped_statement;
sqlite3_prepare(mainApp->GetAppData().db_conn, campaign_sql.c_str(), campaign_sql.length(), &prepped_statement, NULL);
//std::string name((const char *)sqlite3_column_text(prepped_statement, 1));
while ( SQLITE_ROW == sqlite3_step(prepped_statement) ) 
{
    std::string name((const char *)sqlite3_column_text(prepped_statement, 1));
    wxMessageBox(name);
    std::string config((const char *)sqlite3_column_text(prepped_statement, 3));
    wxMessageBox(config);

返回NULL引用错误

std::string name = pds.getCampaignName();
            std::string config = pds.serialize();

            std::string update_sql("INSERT INTO bv_campaigns (name, type, config) VALUES(?,'campaignCallListDataSourcePython',?)");
            sqlite3_stmt *prepped_statement;
            sqlite3_prepare(this->GetAppData().db_conn, update_sql.c_str(), update_sql.length(), &prepped_statement, NULL);

            sqlite3_bind_text(prepped_statement, 1, name.c_str(), name.length(), NULL);
            sqlite3_bind_text(prepped_statement, 3, config.c_str(), config.length(), NULL);

添加数据,序列化和获取广告系列名称功能从添加窗口

获取值

我认为这就是所需要的一切。如果我遗失了什么请问。 感谢

2 个答案:

答案 0 :(得分:2)

您需要在调试器中执行程序。它将显示您访问NULL指针的行。在那里,你将能够弄清楚它是如何进入这种状态的。

答案 1 :(得分:2)

sqlite3_column_text(..., 3)读取第SELECT列的值,即members

此列未由INSERT命令设置,因此为NULL

(此外,在INSERT命令中,参数具有索引1和2;您也从未设置config。)