1

Sybase 12.5ドライバーを備えたDelphi 10でUnidac Stored Proc Componentを使用しています

Sybase proc では、以下のようなエラーが発生していますが、元に戻っていることがわかりましたが、エラー メッセージが表示されません。Unidac またはその他の問題で動作していませんか?

if @number <> null
 begin
  select @errmsg = 'Already active for location ' 
  raiserror 20001 @errmsg 
   return 1 
 end 

以下のようにdelphiでstoredprocを実行しています

try 
  ExecProc; 
  except on E:Exception do 
    begin 
     ErrorMsg(EDatabaseError(ExceptObject).Message,0); 
     Exit; 
   end;

しかし、それでも例外をキャッチできません。

私も以下のように試しました。

try 
  UniStoredProc.StoredProcName := 'test'; 
  UniStoredProc.ExecProc; 
except 
  on E:EUniError do 
    ShowMessage(E.Message); 
end

Sybase 15 クライアント ライブラリで同じコードが正常に動作する

Sybase 15 サーバーと Sybase 12.5 クライアント ライブラリを使用してサーバーに接続していますが、これは問題になりますか? 以前は Sybase 12.5 クライアント ライブラリで BDE を使用していたため、問題は発生していませんでしたが、現在は unidac でこの問題が見つかりました。

4

2 に答える 2

5

比較するには、次のように演算子nullを使用する必要があります。is

if @number is not null
begin
  select @errmsg = 'Already active for location ' 
  raiserror 20001 @errmsg 
  return 1 
end 

これで、if-then ステートメント内のコードを実行する必要があります。

于 2011-08-23T15:27:29.747 に答える
0

答えは、12.5 の代わりに Sybase 15 クライアントを使用してアプリを再デプロイすることのようです。「ANSINULL」オプションを既にオフにしているので、procs 内のコードは確実に例外のトリガーを生成します。そして、Sybase 15 を使用している場合はそうです。

副次的な考え: Sybase 12.5 には、そのリリースでオフになり、Sybase 15 バージョンで「オン」になった接続/クライアント スコープの構成がありますか?

そうでない場合は、Sybase 12.5 のバグであり、Sybase 15 リリースで修正されています (または 13 より前のことかどうかはわかりません)。

再デプロイするだけで、何も書き直す必要はありません。

PS: バージョンが一致しないクライアント ライブラリを使用してアプリをサーバーにデプロイするのは好きではありませんでした。ワームの缶を開ける可能性は常にあります。

PS2: 確かに UniDAC は、12.5 クライアント ライブラリの弱点に触れた BDE (「マイナー共通分母」アプローチのミドルウェア) よりも多くの機能を使用します。
もう 1 つのポイントは、SQL Server (Sybase と共通の遺産を持つ) にraiseerrorseverityパラメーターがあることです。また、重大度 16+ (AFAIR) のメッセージのみがエラーと見なされます。おそらく、BDE はすべてがエラーであると判断し、UniDAC はドキュメントに従っているだけです。
これは非常にワイルドな推測です。

于 2011-08-29T20:45:35.063 に答える