ODBC接続のデータベースに値を登録する際、
CRecordset rs;
rs.Open();
rs.AddNew();
...
rs.Update();
rs.Close();
上記の記述でDB登録を行っています。
ところが、Update関数を呼び出した時に、
「0x5f477959の命令が0x00000014のメモリを参照しようとしました。
メモリがreadになることはありませんでした。」
というメッセージが表示されます。
参照するレコードセットクラスの cpp,h 両ファイルの記述からあるDBフィールドの
記述をコメントアウトするとエラーがでないのですが・・・。
ちなみに、そのフィールドは、属性違反もしていません。
ODBCデータベース関係に詳しい方、
上記のエラーの原因がわかるという方、
お気づきの点ありましたら、
ご指摘ください。
よろしくお願いします。
どのくらいの更新回数か知りませんけど、コミットなどの処理や、OS・DBサーバーのメモリ(仮想)の範囲の考慮してテストしてますか
masaさん、お返事ありがとうございます。
コミットの処理は、レコードセットを閉じた後に、
コミットをかけています。
Update関数を呼び出した後に、行うので、
どうしてもコミットをかける前に異常終了してしまいます。
OS・DBサーバのメモリの範囲についての考慮は…
してないです。(ちなみに更新回数は一回です。)
問題のフィールドが、とんでもない場所のメモリを
参照しているのかな?
もっとよく調べてみます。
何か分かりましたら、報告させていただきます。
かなです。
CRecordSerクラスのcppファイルを調べてみたところ、
こんな結果になりました。
CRecordSetクラスを作成したときに、
~.cppファイルに、各フィールドの属性に対応する
メンバ変数に初期値を格納する処理が自動的に
生成されるのですが、
CDate属性のメンバ変数についてのみ、初期化処理が
施されていませんでした。
そこで、初期値としてNULLを入れてみたところ、
Update関数が行われても、エラーメッセージが出ませんでした。
その後のコミットもかかり、DBの更新がまともに行われました。
う~~ん、一応解決したのかな?
当初は、そのフィールド値を初期化しなくても、
メモリエラーにはならなかったから、
あまり気にしてなかったのですが、
フィールドを1個追加したら、とたんに
そんなエラーが出るようになってしまいました。
最初はたまたま、危険なメモリを参照していなかっただけだったのかも…。
今まで、メモリエラーが出たら、「あー、ダメだ。」
とあきらめていたんですが、
少し(ほんの少しです)はエラーになる原因が
わかった気がします。
masaさん、ありがとうございます。