【问题标题】:sqlite C API, UDATE databasesqlite C API, UDATE 数据库
【发布时间】:2012-10-26 15:17:53
【问题描述】:

我目前正在开发一种在我已经拥有的程序中创建编辑窗口的方法,该程序访问一个 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);

在哪里添加数据,序列化和获取活动名称函数从添加窗口获取值,

我认为这就是所需的一切。如果我缺少任何东西,请询问。 谢谢

【问题讨论】:

    标签: c++ sql database api sqlite


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,如果我似乎对此不太了解,这是我第一次在 c++ 中使用 sqlite,但现在当我尝试选择索引 2 时,我仍然得到相同的 NULL 错误,我将如何访问 INSERTed 值?谢谢你的回复:)
    • 这与SELECT无关; sqlite3_bind_text 的第二个参数应该是第一个和第二个 ? 的 1 和 2。
    • 好的,我想我快到了,但是如果将值插入到配置列中,为什么我不能从数据库中选择它?再次感谢
    • 用其他工具打开数据库文件,检查该列是否实际包含数据。
    • 嗯,你会如何建议我这样做?我有一个 .sdf 文件,经过一番谷歌搜索,我发现了一些不同的收费,但没有一个会起作用,我尝试了 LINQ 和 sqlitebrowser。 :数据库文件是由早期版本的 SQL Server Compact 创建的。请使用 SqlCeEngine.Upgrade() 方法进行升级。是 LINQpad 给出的错误,浏览器程序说它不是 SQL 数据库文件:/
    【解决方案2】:

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

    【讨论】:

    • 调试告诉我发生了错误:- [std::string config((const char *)sqlite3_column_text(prepped_statement, 3));] 但如我的代码所示,我已经设置配置变量的第三个索引:(
    • 看起来对 sqlite3_column_text(prepped_statement, 3) 的调用会返回一个空指针。以这种方式重新编写此代码以验证: const char ptr = (const char)sqlite3_column_text(prepped_statement, 3); std::string config(ptr);
    • ptr 在创建字符串配置之前可能会为空。
    • 另外,您需要在这里重新评估您的投射。 std::string 的构造函数采用常规 char 指针,而不是 const char 指针。
    • @shargors "std::string 的构造函数采用常规 char 指针,而不是 const char 指针" ??从何时??来自 basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2022-01-23
    • 2016-09-30
    • 2010-11-18
    相关资源
    最近更新 更多