はじめまして。
早速ですが教えて下さい。
環境は、Delphi7 + Oracle9iで
リモートデータモジュールを使用してソケット接続の3層アプリを作成しています。
構成は以下になっています。
(1層 DBサーバー)
Oracle
|
----------------------------
(2層 アプリサーバ)
SQLConnection
|
SQLStoredProc
|
DataSetProvider
|
|(ソケット接続)
|
----------------------------
(3層 クライアント)
SocketConnection
|
ClientDataSet
基本的なDBの参照や更新処理などは行えています。
今回、ストアドを利用したく、SQLStoredProcを配置しました。
しかし、ストアドにOUTパラメータを設定するとエラーが(不正なパラメータ)
でて正常に動作しません。
(INパラメータだけなら正常に行える)
ソースは以下です。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
------ストアド本文------
CREATE OR REPLACE PROCEDURE PROC_TABLESET2(
pi_vcName IN VARCHAR2,
pi_nAge IN NUMBER,
po_vcErrMsg OUT VARCHAR2
)AS
BEGIN
po_vcErrMsg := '成功!';
Insert Into Test(namd, age)Values(pi_vcName, pi_nAge);
COMMIT;
EXCEPTION
WHEN OTHERS THEN BEGIN
po_vcErrMsg := '失敗!';
ROLLBACK;
END;
END;
------Delphiソース------
procedure TForm1.Button6Click(Sender: TObject);
begin
try
with DataModule.ClientDataSet do begin
Close;
FetchParams;
Params.ParamByName('pi_vcName').AsString := Edit1.Text;
Params.ParamByName('pi_nAge').AsInteger := StrToInt(Edit2.Text);
Execute;
ShowMessage(Params.ParamByName('po_vcErrMsg').Value);
end;
finally
end;
end;
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
当然、CelientDataSetのRemoteServerプロパティには対応するRemoteServerを設定し、
ProviderNameにも対応するProviderNameを設定しており、各コンポーネントの関連づけは間違いなく行われています。
「Execute」を「Open」に変えてみたりもしたのですが駄目でした。
TSQLCOnnectionの代わりにTDataBaseを利用し、
SQLStoredProcの代わりにStoredProcを利用し、その他の各種設定は変えない場合は動作します。
あと、多層でなく単層(DataSetProviderやCelinetDataSetを使用しない)で行う場合も正常に動作しました。
どこかが間違ってるんでしょうが、わかりません。
どなたかわかる方教えていただけないでしょうか?
よろしくお願いします。
※言葉が足りなくてわかりずらいかもしれませんがよろしくお願いします。
Executeする直前の、Params.ParamByName('po_vcErrMsg')はどうなっていますか?
ParamTypeはptOutputになっていますか。
ptOutputとptResult で、動作が違うかもしれません。
もしかしたら、FetchParamsが間違ってOUTを設定しているのかも・・・。
# こちらに環境がないので確かめられません
それとも、単にVariantとして扱おうとしているからエラーでしょうかね。
Params.ParamByName('po_vcErrMsg').AsStringでもだめですか?
>Executeする直前の、Params.ParamByName('po_vcErrMsg')はどうなっていますか?
Executeする前に、Params.ParamByName('po_vcErrMsg')の値はさわっていません。
>ParamTypeはptOutputになっていますか。
>ptOutputとptResult で、動作が違うかもしれません。
ParamTypeはptOutputになっています。試しにptOutputとptResult でやってみましたが駄目でした。
>Params.ParamByName('po_vcErrMsg').AsStringでもだめですか?
やってみたのですが駄目でした。
FetchParamsをはずしたりしてみましたがやっぱりうまくいきません。
もうちょっと色々がんばってみます。
また何かわかりましたらよろしくお願いします。
ツイート | ![]() |