- PR -

VB2005 AccessViolationExceptionエラー

1
投稿者投稿内容
下級プログラマー
会議室デビュー日: 2008/08/09
投稿数: 2
投稿日時: 2008-08-09 01:23
テーブルアダプタでトランザクション処理をするプログラムを作成しています。

問題点は、テーブルアダプタでDB接続をオープンするときに、
以下のようなエラーが表示されプログラムが途中で落ちてしまいます。

AccessViolationException
「保護されているメモリに読み取りまたは書き込み操作を
 行おうとしました。他のメモリが壊れていることが考えられます。」

色々試して気づいた事は、
@DBサーバーを起動後にプログラムを実行すると上記のエラーが出て落ちる。
Aプログラムが落ちた後に、再度プログラムを実行すると正常に実行される。
 (何度実行してもAccessViolationExceptionは出ません。)
BDBサーバーを再起動し、プログラムを実行するとエラーが出て落ちる。
 以後Aと同じ。

<環境>
言語:VB2005
DB:Oracle 10g
DBサーバー:Windows2003 R2
DBサーバーのメモリ:PC2100を1G×2個,512M×1個
メモリは壊れていないことを確認済みです。

<ソース>
--------------------------------------------------------------
Dim ad1 As New Test1DataSetTableAdapters.Test1TableAdapter
Dim ad2 As New Test2DataSetTableAdapters.Test2TableAdapter

Dim dt1 As New Test1DataSet.Test1DataTable
Dim dt2 As New Test2DataSet.Test2DataTable


Using scope As New System.Transaction.TransactionScope()

ad1.Connection.Open() '←ここでエラー
ad2.Connection = ad1.Connection

'〜省略〜(dt1,dt2編集)

ad1.Update(dt1)
ad2.Update(dt2)

ad1.Connection.Close()

scope.Complete()

End Using
--------------------------------------------------------------
お手数ですが、ご教授お願い致します。

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-08-10 21:16
分散トランザクションを使っている場合、DTCサービスを起動しておく必要があります。
起動していない場合、Oracle用のデータプロバイダでは必要になった時点で自動的に起動されますが、この際に高い確率で件のエラーが発生するようです。
一度出た後、2度目にはエラーが出ないのはこれ(自動起動)が原因です。
下級プログラマー
会議室デビュー日: 2008/08/09
投稿数: 2
投稿日時: 2008-08-11 12:32
なちゃ様

おかげ様で解決しました。ありがとうございます。

一つ、質問で勘違いしていた点があったので書き込みます。

エラーは、DBサーバーを再起動後に起こるのではなく、
Windowsアプリを実行するクライアント側で再起動した時に起こるものでした。
この勘違いでDBサーバーのDTCサービスを起動しておく必要があると思い込み、
クライアント側にDTCサービスを設定してなかったことでエラーが発生していました。




1

スキルアップ/キャリアアップ(JOB@IT)