2011-10-14 25 views
6

ストアドプロシージャの作成に慣れています。だから私は出力パラメータで1つを書いて、出力値にアクセスしたいと思っていました。ストアドプロシージャでOUTPUTパラメータを使用する方法

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

ALTER PROCEDURE selQuery 
    (
     @id int, @code varchar(50) OUTPUT 
    ) 
AS 
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id 
    RETURN @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(); 

エラー:「オブジェクト参照がオブジェクトインスタンスに設定されていません。」 出力パラメータの値を取得します。それを得る方法?

ありがとうございました。

答えて

7

SPのSQLが間違っています。あなたはおそらくあなたの声明では

Select @code = RecItemCode from Receipt where RecTransaction = @id 

をしたい、あなたはRecItemCodeの価値のためにそれを使用しようとしている、@codeを設定されていません。これは、出力パラメーターを使用しようとするとNullReferenceExceptionを説明します。なぜなら、値が決して割り当てられておらず、デフォルトのnullが得られているからです。

他の問題が

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

のように書き換える場合には、変数の代入とデータ検索を混合されたSQL文ということです。これは、いくつかの点を強調しています。データの他の部分に加えて@codeを駆動するデータが必要な場合は、出力パラメータを忘れてデータを選択してください。

Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

コードが必要な場合は、最初に示したSQL文を使用してください。ぶっきらぼうなチャンスでは、あなたが実際にこれはあなたの出力パラメータに値だけでなく、リターンの行のデータの2つの列を割り当てる必要が二つの異なる文

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

を使用し、出力データを必要としています。しかし、これは私をひどく冗長にする。

私が一番上に示したようにSPを書く場合は、単にcmd.ExecuteNonQuery();を呼び出して、出力パラメータの値を読んでください。


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


注:単一の値を返すだけであれば、出力パラメータをまったく含まない別の方法もあります。あなたは

Select RecItemCode from Receipt where RecTransaction = @id 

を書いて、その結果、SPまたはあなたのコード内の出力パラメータは必要ありませんを取得するためにobject obj = cmd.ExecuteScalar();を使用することができます。

+0

アンソニーに感謝、それはたくさんの助けになりました....多くの感謝 – Sandy

+0

ありがとうございました+1。 'オブジェクトobj = cmd.ExecuteScalar();'完璧に働いた。私は2行目のC#コードで必要なものを達成することができました。もう1つは 'myString = obj.ToString();'です。 – FumblesWithCode

24

は名前が間違っている、あなたはそれが

  1. 作業を取得するために対処する必要があるいくつかのものがありますそのない@ouputその@code
  2. あなたは出力にパラメータの方向を設定する必要があります。
  3. AddWithValueは、Addという値がないはずなので、使用しないでください。
  4. 使用ExecuteNonQueryあなたが戻っていない場合は、行

はあなたがParameterDirection.Output列挙とコードで出力パラメータとして出力パラメータを定義する必要が

SqlParameter output = new SqlParameter("@code", SqlDbType.Int); 
output.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(output); 
cmd.ExecuteNonQuery(); 
MessageBox.Show(output.Value.ToString()); 
+0

素晴らしいですが、どのように出力パラメータの値を取得するのですか? output.Value.ToString()は、 "オブジェクト参照がオブジェクトのインスタンスに設定されていません"というエラーを返します。 – Sandy

+0

私は忘れていないので「YOU FORGOT」と言っていませんが、実際にはわかりません:-( – Sandy

+0

@rapsalands、*あなたがクエリを実行した後にパラメータから値を取得した場合cmd.ExecuteNonQuery(); int value = (int)output.Value; ' –

1

試してみてください。そこには数多くの例がありますが、ここにはMSDNのものがあります。

1
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; 
+0

エラーが発生しています。編集ポストを参照してください...ありがとう – Sandy

+0

@rapsalandsコードを実行するだけではありません。それは単体のコードブロックではありません。このエラーは、オブジェクトをインスタンス化していない(つまりインスタンスを新規作成していない)ということです。ストアドプロシージャの出力パラメータから値を取得する方法の一般的な考え方を与えるだけでした。 –

+0

実際に私はSPを学ぼうとしており、かつてそれをやったことはありません。あなたが自分のコードで何が間違っているのかを知ることができれば嬉しいです。私はどこでインスタンスを作成する必要があるのですか? – Sandy

0

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

con.Close(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); 
関連する問題