4

ADO.Netを使用して、Oracleデータベースのストアドプロシージャを呼び出しています。ストアドプロシージャには、NVARCHAR2であるoutパラメータがあります。ストアドプロシージャは次のとおりです。

CREATE OR replace PROCEDURE VALIDATE_Bin ( 
machine_dump_name IN NVARCHAR2, 
lpn               IN NVARCHAR2, 
result            OUT NUMBER, 
message           OUT NVARCHAR2) 
IS 
BEGIN 
    IF lpn LIKE 'A%' THEN 
      result := 1; 
      message := NULL; 
    ELSE 
      IF lpn IS NULL THEN 
        result := 0; 
        message := 'Failed Read'; 
      ELSE 
        result := 0; 
        message := 'Invalid Barcode'; 
      END IF; 
    END IF; 
END;

そして、コマンドのパラメーターを入力するためのc#コードは次のとおりです。

command.Parameters.Add(new OracleParameter("machine_dumper_name",OracleType.NVarChar){Value = "My Dumper"});
command.Parameters.Add(new OracleParameter("lpn", OracleType.NVarChar) { Value ="XYZ1234"});
var resultParam = new OracleParameter("result", OracleType.Number) { Direction = ParameterDirection.Output};
command.Parameters.Add(resultParam);
var messageParam = new OracleParameter("message", OracleType.NVarChar) { Direction = ParameterDirection.Output};
command.Parameters.Add(messageParam);

command.ExecuteNonQuery();

このように実行すると、例外が発生します。

System.Exception:パラメータ'メッセージ':可変長データ型にサイズが設定されていません:文字列。

心配ありません。Oracleでは、「message」パラメータに文字列の長さが必要です。そこで、「メッセージ」パラメータにサイズパラメータを追加します。

var messageParam = new OracleParameter("message", OracleType.NVarChar, 255) { Direction = ParameterDirection.Output};

次に、それを実行すると、次のSystem.Data.OracleClient.OracleExceptionが発生します。

PLS-00306:「VALIDATE_Bin」の呼び出しで引数の数またはタイプが正しくありません

この手順を呼び出してメッセージを出すにはどうすればよいですか?この問題は文字列データ型に固有のものだと思います。これはバグですか?それとも私は何か間違ったことをしていますか?

4

2 に答える 2

1

試す

var messageParam = new OracleParameter("message", OracleDbType.NVarchar2,UInt16.MaxValue) { Direction = ParameterDirection.Output};
messageParam.Value = DbNull.Value
于 2012-05-02T13:39:27.733 に答える
1

@ psaraj12のコメントの1つを読んだ後、問題のパラメーターが「メッセージ」パラメーターではない可能性があることに気付きました。ストアドプロシージャから変数を1つずつ削除した後、パラメータ名の不一致を発見しました。手順では:

machine_dump_name IN NVARCHAR2, 

およびC#コード:

new OracleParameter("machine_dumper_name",OracleType.NVarChar)

みなさん、アイデアありがとうございます!パラメータの実際の名前(machine_DUMP_name)を使用すると、すべてが完全に機能しました。

于 2012-05-03T23:12:33.143 に答える