2

私は現在、すでに持っているプログラムで編集ウィンドウを作成する方法の開発に取り組んでいます。これは、設定され、情報、エントリのID、エントリの名前(ユーザー指定)の4つの部分を含むSqliteデータベースにアクセスします。 )、ファイルの場所(ユーザーも入力)およびグループのメンバー。編集ウィンドウには、名前のテキスト入力ボックスとファイルブラウザを開くためのボタンの2つのラベルがあります。私の問題は、新しい追加ウィンドウで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);

データが追加される場合、シリアル化してキャンペーン名を取得する関数は、追加ウィンドウから値を取得します。

必要なのはそれだけだと思います。足りないものがあればお問い合わせください。ありがとう

4

2 に答える 2

2

デバッガーでプログラムをステップ実行する必要があります。NULL ポインターにアクセスする行が表示されます。そこで、どのようにしてそのような状態になるかを理解することができます。

于 2012-10-26T15:34:58.203 に答える
2

sqlite3_column_text(..., 3)SELECTは、4 番目の列の値を読み取りますmembers

この列はINSERTコマンドによって設定されていないため、 ですNULL

(また、INSERTコマンドでは、パラメーターにはインデックス 1 と 2 があり、どちらも設定しませんconfig。)

于 2012-10-26T16:10:24.440 に答える