メモリ参照エラーを回避するには? – プログラミング – Home

メモリ参照エラーを回避するには?
 
通知
すべてクリア

[解決済] メモリ参照エラーを回避するには?


かな
 かな
(@かな)
ゲスト
結合: 24年前
投稿: 15
Topic starter  

ODBC接続のデータベースに値を登録する際、

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

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

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

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

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

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

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

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

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

よろしくお願いします。


引用未解決
トピックタグ
masa
 masa
(@masa)
ゲスト
結合: 24年前
投稿: 64
 

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


返信引用
かな
 かな
(@かな)
ゲスト
結合: 24年前
投稿: 15
Topic starter  

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

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

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

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

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

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

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


返信引用
かな
 かな
(@かな)
ゲスト
結合: 24年前
投稿: 15
Topic starter  

かなです。
CRecordSerクラスのcppファイルを調べてみたところ、
こんな結果になりました。

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

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

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

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました