質問者
実行中にこける。VB.Net+Access2000(ADO)

質問
-
現在、AccessをADOでアクセスして、VBから利用するプログラムを作成しています。
利用環境は VB.Net Express(SP1)+Access(Office SP3),OS:WindowsXPHome(SP1)です。
ADOでAccess内のデータ用テーブルからワーク用テーブルへインサートするプログラムを作っていますが、以下のようなメッセージこけてしまいます。(メッセージはRelease版で動作)
************** 例外テキスト **************
System.Runtime.InteropServices.COMException (0x80004005): 引数が無効です。
場所 ADODB.ConnectionClass.Execute(String CommandText, Object& RecordsAffected, Int32 Options)
場所 XXXXXXXX.ClsDBCtr.InsertTemp(DateTime dSDate) 場所 D:\Project\XXXXXXXX\XXXXXXXX\ClsDBCtr.vb:行 98なお、こけるのはこのコードを何十回と動作させたときに発生し、1回目ですぐには発生しません。
コードの内容は
Private m_adoCnn As ADODB.Connection
'作業用テーブルにデータを追加する。
Public Function InsertTemp(ByVal dSDate As Date) As Integer
Dim stSql As String
Dim nRecord As Integer'記録済みデータがあれば、削除
stSql = "INSERT INTO DATAWORK_TBL SELECT DATA_TBL.* FROM DATA_TBL ”
stSql = stSql & "WHERE DATA_TBL.日付 Between #" & GetStrtDate(dSDate).ToString("yyyy/MM/dd") & "# And #" & GetEndDate(dSDate).ToString("yyyy/MM/dd") & "#"m_adoCnn.Execute(stSql, nRecord) ← ここでこける
If nRecord <= 0 Then
Return -1
Else
Return 0
End IfEnd Function
m_adoCnnは既に接続済みで、レコードセットも読めています。
問題箇所のnRecordを削除しても、やはりこけてしまいます。 try~catchを入れれば、こけないようにはなりますが、理由が不明な点は変わりません。
これだけでは原因を知るのは難しいと思います。そこで、問題点を洗い出すために何を調べればいいのでしょうか?よろしく教えて下さい。
すべての返信
-
返信ありがとうございます。
>m_adoCnnのOpenとCloseが的確に行われているか?ということです。
サンプルソースはm_adoCnnが開いて、からずっと実行しっぱなしです。処理がすべて完了して初めて、Closeされるので関連は薄いかと思いますが・・・。
ちなみに、サンプルソースはクラスの中で処理しており、クラスが作成されると同時にOpenし、クラスが破棄される直前にCloseする仕様となっています。
追記です。
ある時間がたつと、必ずエラーが発生します。今のところ、耐用時間は45分~1時間というところです。TimeOutに関連しているかとCommandTimeOutを0にしても発生していますので、TimeOutは関係ないようです。
-
.NETからのADOの利用は問題が発生することがあります。
かわりにADO.NETの利用を検討してみて下さい。.NET での ADO の使用に関するロードマップ
http://support.microsoft.com/kb/308044/ja -
> かわりにADO.NETの利用を検討してみて下さい。
早急に対策要でしたので、IOの発生を抑えるというプログラムロジックの変更で対処しました。
ADO.Netについては、当初から考えていたのですが、Accessでは全くうまく処理できなかったため、導入に至っていません。
再度、挑戦して確かめてみます。
それから確かではないですが、うまく行かなかった原因としては、実行しっぱなしのため、ADO側でなく、.Net Frameとの通信タイムアウトの可能性があります。実際、改良版ではContextSwitchDealDockをはずさないと、最後まで実行しませんでした(エラーは発生しなかった)。