私はストアドプロシージャを書くのが初めてです。そのため、出力パラメーターを使用して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();
エラー:「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」出力パラメータの値を取得したい。どうすれば入手できますか?
ありがとう。
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またはコードに出力パラメーターは必要ありません。
それを機能させるために取り組む必要があるいくつかの事柄があります
@ouput
その@code
AddWithValue
は使用しないでください。これは、Add
だけの値を持つべきではないためです。ExecuteNonQuery
を使用します試す
SqlParameter output = new SqlParameter("@code", SqlDbType.Int);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);
cmd.ExecuteNonQuery();
MessageBox.Show(output.Value.ToString());
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;
ParameterDirection.Output
列挙型のコードで、出力パラメーターを出力パラメーターとして定義する必要があります。これには数多くの例がありますが、ここでは [〜#〜] msdn [〜#〜] の例を示します。
出力パラメーターを使用する前に、接続を閉じる必要があります。このようなもの
con.Close();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString());