C++ sqlite C API,UDATE数据库

C++ sqlite C API,UDATE数据库,c++,sql,database,api,sqlite,C++,Sql,Database,Api,Sqlite,我目前正在开发一种在我已有的程序中创建编辑窗口的方法,该方法访问一个Sqlite数据库,该数据库已设置,包含4个信息、条目id、条目名称(由用户指定)、文件位置(也由用户输入)和组成员。 在编辑窗口中,有两个标签,一个用于名称的文本输入框和一个用于打开文件浏览器的按钮。 我的问题是,当我在“添加新数据”窗口中设置sql数据库时,所有数据都设置在数据库中,尽管当我想编辑数据库中的数据时,我当前删除了旧数据,然后添加了新数据,尽管查看了行上的文档,我发现了一种更新方法,尽管这会更好,但不知怎么的,我

我目前正在开发一种在我已有的程序中创建编辑窗口的方法,该方法访问一个Sqlite数据库,该数据库已设置,包含4个信息、条目id、条目名称(由用户指定)、文件位置(也由用户输入)和组成员。 在编辑窗口中,有两个标签,一个用于名称的文本输入框和一个用于打开文件浏览器的按钮。 我的问题是,当我在“添加新数据”窗口中设置sql数据库时,所有数据都设置在数据库中,尽管当我想编辑数据库中的数据时,我当前删除了旧数据,然后添加了新数据,尽管查看了行上的文档,我发现了一种更新方法,尽管这会更好,但不知怎么的,我无法为数据库获取正确的索引,如何调用索引3,我得到了一个错误

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

返回空引用错误

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);
在添加数据的位置,序列化和获取活动名称函数从添加窗口获取值

我想这就是我所需要的一切。如果我遗漏了什么,请告诉我。
谢谢,您需要在调试器中逐步执行您的程序。它将显示您在哪一行访问空指针。在那里,您将能够了解它是如何进入这种状态的。

您需要在调试器中逐步执行您的程序。它将显示您在哪一行访问空指针。在那里,您将能够了解我是如何访问空指针的t进入这种状态。

sqlite3\u column\u text(…,3)
读取第四个
选择
列的值,该列是
成员

您的
INSERT
命令未设置此列,因此它是
NULL

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

sqlite3\u column\u text(…,3)
读取第四个
选择
列的值,该列是
成员

您的
INSERT
命令未设置此列,因此它是
NULL



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

调试告诉我发生了错误:-[std::string config((const char*)sqlite3_column_text(prepped_语句,3))],但如我的代码所示,我用config变量设置了第三个索引:(看起来像对sqlite3_column_text的调用(prepped_语句,3)然后返回一个空指针。以这种方式重新编写此代码以验证:const char ptr=(const char)sqlite3_column_text(prepped_语句,3);std::string config(ptr);在创建字符串配置之前,ptr可能会为null。此外,您需要在此处重新计算您的强制转换。std::string的构造函数采用常规字符指针,而不是常量字符指针。@shargors“std::string的构造函数采用常规字符指针,而不是常量字符指针”?从何时开始?
basic_string(const\u CharT*\uu s,const\u Alloc&\uu a=\u Alloc())
调试告诉我发生了错误:-[std::string config((const char*)sqlite3\u column\u text(prepped\u语句,3));]但是如我的代码所示,我已经用配置变量设置了第三个索引:(看起来像是调用sqlite3\u column\u text(prepped\u语句,3)然后返回空指针。以这种方式重新编写此代码以验证:const char ptr=(const char)sqlite3_column_text(prepped_语句,3);std::string config(ptr);在创建字符串配置之前,ptr可能会为null。此外,您需要在此处重新计算您的强制转换。std::string的构造函数采用常规字符指针,而不是常量字符指针。@shargors“std::string的构造函数采用常规字符指针,而不是常量字符指针”?从何时开始?
basic_string(const ythiga*yss,constαalp&a ay= yalLoCo())< /C> >对不起,如果我对这个似乎不太了解,这是我第一次在C++中使用SQLite,但是现在当我尝试选择索引2时,我仍然得到相同的NULL错误,我将如何访问插入的值?谢谢您的响应:这与
SELECT
无关;
sqlite3\u bind\u text
的第二个参数对于第一个和第二个
应该是1和2。好的,我想我已经到了,但是如果这些值被插入到config列中,为什么我不能从数据库中选择它呢?再次感谢使用另一个工具打开数据库文件进行检查是否该列实际包含data.um,您会建议我怎么做?我有一个.sdf文件,在谷歌搜索之后,我发现了一些不同的收费,但都不起作用,我尝试了LINQ和sqlitebrowser。注意:数据库文件是由SQL Server Compact的早期版本创建的。请使用SqlCeEngine.upgrade()进行升级方法。LINQpad给出的错误,浏览器程序说它不是SQL数据库文件:/对不起,如果我对这个问题不太了解,这是我第一次在C++中使用SQLite,但是现在当我尝试选择索引2时,我仍然得到相同的NULL错误,我将如何访问插入的值?谢谢您的关注。e:)这与
SELECT
无关;
sqlite3\u bind\u text
的第二个参数对于第一个和第二个
应该是1和2。好的,我想我已经到了,但是如果这些值被插入到config列中,为什么我不能从数据库中选择它呢?再次感谢使用另一个工具打开数据库文件进行检查是否该列实际包含数据。嗯,您建议我如何做?我有一个.sdf文件,在谷歌搜索之后,我发现了一些不同的收费,但都不起作用,我尝试了LINQ和sqlitebrowser。注意:数据库文件是由SQL Server Compact的早期版本创建的。请使用
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);