none
実行中にこける。VB.Net+Access2000(ADO) RRS feed

  • 質問

  • 現在、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 If

        End Function

    m_adoCnnは既に接続済みで、レコードセットも読めています。

    問題箇所のnRecordを削除しても、やはりこけてしまいます。 try~catchを入れれば、こけないようにはなりますが、理由が不明な点は変わりません。

     

    これだけでは原因を知るのは難しいと思います。そこで、問題点を洗い出すために何を調べればいいのでしょうか?よろしく教えて下さい。

     

     

    2008年5月21日 7:10

すべての返信

  • とりあえず気になったのは、m_adoCnnのOpenとCloseが的確に行われているか?ということです。

    2008年5月21日 8:29
    モデレータ
  • 返信ありがとうございます。

     

    >m_adoCnnのOpenとCloseが的確に行われているか?ということです。

     

    サンプルソースはm_adoCnnが開いて、からずっと実行しっぱなしです。処理がすべて完了して初めて、Closeされるので関連は薄いかと思いますが・・・。

     

    ちなみに、サンプルソースはクラスの中で処理しており、クラスが作成されると同時にOpenし、クラスが破棄される直前にCloseする仕様となっています。

     

    追記です。

    ある時間がたつと、必ずエラーが発生します。今のところ、耐用時間は45分~1時間というところです。TimeOutに関連しているかとCommandTimeOutを0にしても発生していますので、TimeOutは関係ないようです。

     

    2008年5月21日 9:44
  • .NETからのADOの利用は問題が発生することがあります。
    かわりにADO.NETの利用を検討してみて下さい。

     

    .NET での ADO の使用に関するロードマップ
    http://support.microsoft.com/kb/308044/ja

    2008年5月22日 6:29
  • > かわりにADO.NETの利用を検討してみて下さい。

     

    早急に対策要でしたので、IOの発生を抑えるというプログラムロジックの変更で対処しました。

    ADO.Netについては、当初から考えていたのですが、Accessでは全くうまく処理できなかったため、導入に至っていません。

    再度、挑戦して確かめてみます。

    それから確かではないですが、うまく行かなかった原因としては、実行しっぱなしのため、ADO側でなく、.Net Frameとの通信タイムアウトの可能性があります。実際、改良版ではContextSwitchDealDockをはずさないと、最後まで実行しませんでした(エラーは発生しなかった)。

     

     

    2008年5月22日 7:51