ADOについて


つも  2004-12-22 13:35:54  No: 87543  IP: [192.*.*.*]

いつもお世話になっております。

WindowsXP,VB6.0SP5で開発してます。
親APがADOで接続してそのコネクションをDLLに引数として
渡してDLL内も同じコネクションで動作するようなAPを作成
しているのですが、DLLをプロジェクトから起動させて
動作確認をしているとDLL内でレコードセットを作成しようとすると
>RS.Open SQL, objAdoCon(引数で渡したコネクション), adOpenStatic, adLockOptimistic,adAsyncExecute
『引数が間違った型、許容範囲外、または競合しています』
というエラーがでて、何が悪いのかが分かりません。
ちなみにDLLをそのまま使用するとエラーは発生しません。

どなたか助言よろしくお願いします。

編集 削除
たくみ  2004-12-25 05:30:02  No: 87544  IP: [192.*.*.*]

DLLって何のDLLなのかしら?
(C++とかじゃなく)雰囲気からしてVBで書いた
ActiveX DLLなんですよね?

ちなみに、コネクションをなぜそのDLLの世界まで
ひきずり回したいのか、動機が知りたいのですが。
そんなことするメリットが・・

ここは考え方を変えて(その親プログラムとDLLとのデータの
キャッチボールさえできればいいんですよね?ならば、)
親APから空のレコードセットをDLL側に(あえて)ByRefで渡して
DLL内で(SQL文を実行し)中身を詰めた状態にして
親にそのままそっくりレコードセットで返す、
とかすれば、結構たいていの処理はできそうな感じしませんか?
ちょっとかっこよさはないかもしれないけど・・

あ、この場合もちろんADOのコネクション生成は
そのActiveX DLL側でのみします。
というか親側でする意味がよくわからなかったのです。
DBに関わる部分(ここではADO関係の処理)をひとまとめにしたのが
そのDLL、という位置づけの方が階層わけされたシステム風になるし。
そっちのほうがメリットが大なんじゃ?
で、冒頭の動機が疑問、というわけなんです。

つまりイメージとしては、ADOコネクション生成とレコードセット作成と
SQL文の送り込みなどもろもろの公開するプロパティ設定、というのを
ひとまとめにした内容のActiveX DLLをこしらえておく、という意味です。

って、またまたはずしてますか〜?

編集 削除
つも  2005-01-04 11:31:44  No: 87545  IP: [192.*.*.*]

返事が遅くなりまして、申し訳ありません。
本当は、たくみさんが言うことが正解なのかもしれないですけど、
例えば、
BeginTrans
受注データ作成
在庫引当処理
出荷データ作成
CommitTrans
といった
処理の流れの中で
在庫処理のみがDLLだったみたいな感じなのです。
ですので、BeginTransしたコネクションをDLLにまで引き継がせたいのですが、
こういう場合には、どのようにすればよいのでしょうか?

編集 削除
たくみ  2005-01-11 23:03:18  No: 87546  IP: [192.*.*.*]

たくみです。
返事が遅くなってすみません。もう見てませんかねえ?

とりあえずテストコードを書いて試してみました。
イメージはこんな感じです。
あくまでもイメージなんでいろいろとはしょって書いてます。

本来はByRefはあまり使いたくないのですが
仕様が仕様だけにとりあえずByRefで引数としてコネクションを
引き渡しています。
ちなみにこのコードで(コネクション文字列を適切に与えたら)
ちゃんとノーエラーで動作してますよ。

※親アプリ側のイメージ
Private Sub Command1_Click()
    Dim CnTmp As ADODB.Connection
    Dim RsTmp As ADODB.Recordset
    Dim sFlg As String
    Dim SQL As String
    Dim bRet As Boolean

    On Error GoTo ErrLab
    
    Set CnTmp = New ADODB.Connection
    
    With CnTmp
        .Errors.Clear
        .Mode = adModeReadWrite     'これ結構ポイント
        .ConnectionString = "どうのこうの"  'あくまでイメージ

        'ADOコネクションのオープン
        If .State = adStateClosed Then
            .Open
        End If
    
        'オープンできたかのチェック
        If .State <> adStateOpen Then
            MsgBox "コネクションが確立できません", vbExclamation + vbOKOnly
            Exit Sub
        End If
    End With

    SQL = "SELECT * FROM MyTable"  'あくまでイメージ

    Set RsTmp = New ADODB.Recordset

    With RsTmp

        'Rs作成
        RsTmp.Open SQL, CnTmp, _
    adOpenDynamic, adLockOptimistic, adCmdText
    
        If .EOF Then
      'エラーエコーをここに書く
            Exit Sub
        End If

    End With
    
    'ここに受注データ作成処理を書く
    '・
    '・

    'ここが在庫引当処理のつもり
    bRet = PutCn(CnTmp, sFlg, RsTmp)

    'ここに出荷データ作成処理を書く
    '・
    '・

    RsTmp.Close
    Set RsTmp = Nothing
    CnTmp.Close
    Set CnTmp = Nothing

    Exit Sub

ErrLab:

End Sub

'※ここがActiveDLL側に置く処理イメージです
Public Function PutCn(ByRef Cn As ADODB.Connection, _
                     ByRef CnTranStat As String, _
                     ByRef Rs As ADODB.Recordset _
                     ) As Boolean
    On Error GoTo ErrLab

    PutCn = False

    'あまり意味ないけどとりあえず現在のCnの状態をフラグに書いておく
    CnTranStat = "Before_BeginTrans"
    
    Cn.BeginTrans

    CnTranStat = "After_BeginTrans"
    
    Rs.Fields(0).Value = "ABC"  'とりあえず最初の文字項目にABCと書いてみる
    Rs.Update                   '本当はここにメインの在庫引当て処理を書く

    CnTranStat = "Before_CommitTrans"
    
    Cn.CommitTrans

    CnTranStat = "After_CommitTrans"
        
    MsgBox CnTranStat

    PutCn = True

    Exit Function
    
ErrLab:
    MsgBox CnTranStat, vbCritical + vbSystemModal

End Function

編集 削除