いつもお世話になっております。
WindowsXP,VB6.0SP5で開発してます。
親APがADOで接続してそのコネクションをDLLに引数として
渡してDLL内も同じコネクションで動作するようなAPを作成
しているのですが、DLLをプロジェクトから起動させて
動作確認をしているとDLL内でレコードセットを作成しようとすると
>RS.Open SQL, objAdoCon(引数で渡したコネクション), adOpenStatic, adLockOptimistic,adAsyncExecute
『引数が間違った型、許容範囲外、または競合しています』
というエラーがでて、何が悪いのかが分かりません。
ちなみにDLLをそのまま使用するとエラーは発生しません。
どなたか助言よろしくお願いします。
DLLって何のDLLなのかしら?
(C++とかじゃなく)雰囲気からしてVBで書いた
ActiveX DLLなんですよね?
ちなみに、コネクションをなぜそのDLLの世界まで
ひきずり回したいのか、動機が知りたいのですが。
そんなことするメリットが・・
ここは考え方を変えて(その親プログラムとDLLとのデータの
キャッチボールさえできればいいんですよね?ならば、)
親APから空のレコードセットをDLL側に(あえて)ByRefで渡して
DLL内で(SQL文を実行し)中身を詰めた状態にして
親にそのままそっくりレコードセットで返す、
とかすれば、結構たいていの処理はできそうな感じしませんか?
ちょっとかっこよさはないかもしれないけど・・
あ、この場合もちろんADOのコネクション生成は
そのActiveX DLL側でのみします。
というか親側でする意味がよくわからなかったのです。
DBに関わる部分(ここではADO関係の処理)をひとまとめにしたのが
そのDLL、という位置づけの方が階層わけされたシステム風になるし。
そっちのほうがメリットが大なんじゃ?
で、冒頭の動機が疑問、というわけなんです。
つまりイメージとしては、ADOコネクション生成とレコードセット作成と
SQL文の送り込みなどもろもろの公開するプロパティ設定、というのを
ひとまとめにした内容のActiveX DLLをこしらえておく、という意味です。
って、またまたはずしてますか〜?
返事が遅くなりまして、申し訳ありません。
本当は、たくみさんが言うことが正解なのかもしれないですけど、
例えば、
BeginTrans
受注データ作成
在庫引当処理
出荷データ作成
CommitTrans
といった
処理の流れの中で
在庫処理のみがDLLだったみたいな感じなのです。
ですので、BeginTransしたコネクションをDLLにまで引き継がせたいのですが、
こういう場合には、どのようにすればよいのでしょうか?
たくみです。
返事が遅くなってすみません。もう見てませんかねえ?
とりあえずテストコードを書いて試してみました。
イメージはこんな感じです。
あくまでもイメージなんでいろいろとはしょって書いてます。
本来は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