DOBON.NETプログラミング道掲示板

No34043 の記事


■34043 / )  Re[1]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1170回)-(2018/11/26(Mon) 19:13:41)
  • アイコン2018/11/27(Tue) 11:15:33 編集(投稿者)

    No34042に返信(Yoshiさんの記事)
    > AddTableを使いストアドプロシージャで配列として受け渡しをしているようなのですが
    > ADOで渡すための方法がわからず、ご教示いただきたいと思っております。

    ADODB では対応していないと思います。

    ストアドを変更できるなら、配列パラメータ(Associative Array)を用いず、
    Temporary Table 経由で受け渡す作りに書き換えてみてはいかがでしょう。

    ストアドを変更できない場合は、配列渡しができるよう、
    32bit 版プロセスな VBScript 経由で OO4O を呼び出すか、
    もしくは、ODP.NET 経由で呼び出すようなラッパーライブラリを
    作ることを検討してみるとか。


    > Set param = cmd.CreateParameter("inAnimal", adVarChar Or adArray, adParamInput, 255, AnimalSet)

    Set p = cmd.CreateParameter("inAnimal", 型, adParamInput)
    cmd.Parameters.Append p
    Let p.Value = 値
    cmd.Execute

    の構文で実験してみました。


    (1) 「adVarChar Or adVarArray」「adBSTR Or adArray」
    → cmd.Parameters.Append の時点で ADO エラー: adErrInvalidParamInfo
     
    (2) 「adVariant Or adVarArray」「adVariant」
    → Variant()、Variant を受け付けたが、Execute 時に実行時例外(E_FAIL)を起こす。Err.Description は毎回変化するゴミ文字列なので、ポインタが破壊されている可能性あり。
     
    (3) adIUnknown
    → 渡すべきインターフェイスがわからないのですが、
     少なくとも下記のコードでは、内部エラーでクラッシュしました。
     
    'Dim rec As ADODB.Recordset
    'Set rec = New ADODB.Recordset
    'rec.Fields.Append "F1", adVarChar, 2000, adFldIsNullable
    'rec.Open
    'rec.AddNew Array("F1"), Array("いぬ")
    'rec.AddNew Array("F1"), Array("ねこ")
    'rec.AddNew Array("F1"), Array("かめ")
    'rec.UpdateBatch

    'Dim rec As Scripting.Dictionary
    'rec dic = New Scripting.Dictionary
    'rec(12) = "いち"
    'rec(34) = "に"
    'rec(56) = "さん"

    'Dim rec As VBA.Collection
    'Set rec = New VBA.Collection
    'rec.Add "いち", "12"
    'rec.Add "に", "34"
    'rec.Add "さん", "56"

    'Set p.Value = rec 'VBA エラー: 424 オブジェクトが必要です
    'Let p.Value = rec 'ADO エラー: adErrInvalidArgument
    Dim uk As stdole.IUnknown
    Set uk = rec
    'Set p.Value = uk 'VBA エラー: 424 オブジェクトが必要です
    Let p.Value = uk 'ここまでは実行できた
    cmd.Execute 'ここでクラッシュ
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -