メモリ参照エラーを回避するには?

[戻る]
かな 2001/03/30(金) 09:08:02
ODBC接続のデータベースに値を登録する際、

CRecordset rs;
rs.Open();
rs.AddNew();
...
rs.Update();
rs.Close();

上記の記述でDB登録を行っています。

ところが、Update関数を呼び出した時に、

「"0x5f477959"の命令が"0x00000014"のメモリを参照しようとしました。
 メモリが"read"になることはありませんでした。」

というメッセージが表示されます。

参照するレコードセットクラスの cpp,h 両ファイルの記述からあるDBフィールドの
記述をコメントアウトするとエラーがでないのですが・・・。

ちなみに、そのフィールドは、属性違反もしていません。

ODBCデータベース関係に詳しい方、
上記のエラーの原因がわかるという方、

お気づきの点ありましたら、
ご指摘ください。

よろしくお願いします。

masa 2001/04/15(日) 02:04:13
どのくらいの更新回数か知りませんけど、コミットなどの処理や、OS・DBサーバーのメモリ(仮想)の範囲の考慮してテストしてますか

かな 2001/04/16(月) 09:09:15
masaさん、お返事ありがとうございます。

コミットの処理は、レコードセットを閉じた後に、
コミットをかけています。

Update関数を呼び出した後に、行うので、
どうしてもコミットをかける前に異常終了してしまいます。

OS・DBサーバのメモリの範囲についての考慮は…
してないです。(ちなみに更新回数は一回です。)

問題のフィールドが、とんでもない場所のメモリを
参照しているのかな?

もっとよく調べてみます。

何か分かりましたら、報告させていただきます。

かな 2001/04/16(月) 10:00:26
[[解決]]
かなです。
CRecordSerクラスのcppファイルを調べてみたところ、
こんな結果になりました。

CRecordSetクラスを作成したときに、
〜.cppファイルに、各フィールドの属性に対応する
メンバ変数に初期値を格納する処理が自動的に
生成されるのですが、
CDate属性のメンバ変数についてのみ、初期化処理が
施されていませんでした。

そこで、初期値としてNULLを入れてみたところ、
Update関数が行われても、エラーメッセージが出ませんでした。
その後のコミットもかかり、DBの更新がまともに行われました。

う〜〜ん、一応解決したのかな?

当初は、そのフィールド値を初期化しなくても、
メモリエラーにはならなかったから、
あまり気にしてなかったのですが、
フィールドを1個追加したら、とたんに
そんなエラーが出るようになってしまいました。

最初はたまたま、危険なメモリを参照していなかっただけだったのかも…。

今まで、メモリエラーが出たら、「あー、ダメだ。」
とあきらめていたんですが、
少し(ほんの少しです)はエラーになる原因が
わかった気がします。

masaさん、ありがとうございます。

古いスレッドには追加発言できません。