web-dev-qa-db-ja.com

ストアドプロシージャでOUTPUTパラメータを使用する方法

私はストアドプロシージャを書くのが初めてです。そのため、出力パラメーターを使用して1つ作成し、出力値にアクセスしたいと思っています。

私のストアドプロシージャ:

ALTER PROCEDURE selQuery
    (
        @id int, @code varchar(50) OUTPUT
    )
AS
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id
    RETURN @code

「@ code = RecItemCode」を設定しようとすると、「変数に値を割り当てるSELECTステートメントをデータ取得操作と組み合わせてはいけません」というエラーが発生します。

そして、私はストアドプロシージャを次のように使用しています:

con.Open();
cmd.Parameters.AddWithValue("@id", textBox1.Text);
SqlParameter code = new SqlParameter("@code", SqlDbType.Int);
code.Direction = ParameterDirection.Output;
cmd.Parameters.Add(code);
SqlDataReader sdr = cmd.ExecuteReader();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); // getting error
con.Close();

エラー:「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」出力パラメータの値を取得したい。どうすれば入手できますか?

ありがとう。

6
Sandy

SPのSQLは間違っています。

_Select @code = RecItemCode from Receipt where RecTransaction = @id
_

ステートメントでは、@ codeを設定せず、RecItemCodeの値に使用しようとしています。これは、出力パラメーターを使用しようとするときにNullReferenceExceptionを説明します。値が割り当てられることはなく、デフォルトのnullが取得されるためです。

他の問題は、SQLステートメントが

_Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id
_

変数の割り当てとデータの取得が混在しています。これはいくつかのポイントを強調しています。データの他の部分に加えて@codeを駆動するデータが必要な場合は、出力パラメーターを忘れて、データを選択してください。

_Select RecItemCode, RecUsername from Receipt where RecTransaction = @id
_

コードだけが必要な場合は、最初に示したSQLステートメントを使用してください。オフハンドで実際に出力が必要な場合andデータ、2つの異なるステートメントを使用

_Select @code = RecItemCode from Receipt where RecTransaction = @id
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id
_

これにより、出力パラメーターに値が割り当てられ、1行に2列のデータが返されます。しかし、これはひどく冗長であると私に思わせます。

SPを上に示したように記述した場合は、cmd.ExecuteNonQuery();を呼び出して、出力パラメーター値を読み取ります。


SPとコードに関する別の問題。SPでは、@ codeをvarcharとして宣言しています。コードでは、パラメータータイプをIntとして指定します。SPまたはコードを変更して、型に一貫性を持たせます。


また、注意:単一の値を返すだけの場合は、出力パラメーターをまったく使用しない別の方法があります。あなたは書くことができます

_ Select RecItemCode from Receipt where RecTransaction = @id
_

そしてobject obj = cmd.ExecuteScalar();を使用して結果を取得します。SPまたはコードに出力パラメーターは必要ありません。

7
Anthony Pegram

それを機能させるために取り組む必要があるいくつかの事柄があります

  1. 名前が間違っている@ouputその@code
  2. パラメータの方向を出力に設定する必要があります。
  3. AddWithValueは使用しないでください。これは、Addだけの値を持つべきではないためです。
  4. 行を返さない場合はExecuteNonQueryを使用します

試す

SqlParameter output = new SqlParameter("@code", SqlDbType.Int);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);
cmd.ExecuteNonQuery();
MessageBox.Show(output.Value.ToString());
25
Conrad Frix
SqlCommand yourCommand = new SqlCommand();
yourCommand.Connection = yourSqlConn;
yourCommand.Parameters.Add("@yourParam");
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output;

// execute your query successfully

int yourResult = yourCommand.Parameters["@yourParam"].Value;
1
user596075

ParameterDirection.Output列挙型のコードで、出力パラメーターを出力パラメーターとして定義する必要があります。これには数多くの例がありますが、ここでは [〜#〜] msdn [〜#〜] の例を示します。

1
Bryan Crosby

出力パラメーターを使用する前に、接続を閉じる必要があります。このようなもの

con.Close();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString());
0
Sean