2011-12-13 7 views
1

私はそうであるようなストアドプロシージャを持っています。sqlCommand.ExecuteNonQuery()を使用してスコープのIDを返す

ALTER PROCEDURE dbo.addPackage(

    @PackageStatus      VARCHAR(50) = null, 
    @OrgCode       VARCHAR(50) = null, 
    @SystemID       VARCHAR(50) = null, 
    @ID        int OUTPUT 
) 
AS 
BEGIN 
    insert into package_table 
    (
      PackageStatus, 
      OrgCode, 
      SystemID 
      ) 
      values 
      (@PackageStatus, 
      @OrgCode, 
      @SystemID 
      ) 
      SET @ID = SCOPE_IDENTITY() 
END 

そして、私の関数は、SQLコマンドに次のパラメータを追加し、sqlCommand.ExecuteNonQuery();

List<SqlParameter> parameters = new List<SqlParameter>(); 

parameters.Add(new SqlParameter("@PackageStatus", package.PackageStatus)); 
parameters.Add(new SqlParameter("@OrgCode", package.OrgCode)); 
parameters.Add(new SqlParameter("@SystemID", package.SystemID)); 

SqlParameter outParameter = new SqlParameter("@ID", SqlDbType.Int); 
outParameter.Direction = ParameterDirection.Output; 
parameters.Add(outParameter); 

を呼び出しますが、私は私が宣言outパラメータを持っており、それを設定しevneかかわらず、バック保存porcuedureから0を得続けますストアドプロシージャが終了する前に。レコードは正常にIDの自動インクリメント値で追加されますが、出力パラメータを取得するとIDは返されません。それは0に設定されています。

何か提案がありますか?

+2

出力パラメータの代わりにスカラ値を返すことはできますか? IMHOを扱いやすくなりました。 – sfuqua

+0

コードが間違っているようです。あなたのパラメータ名はiD(小文字のI)として定義され、SET文はID(大文字のI)とコードを使用して、完全に異なるAPIDを使用する出力パラメータの値を取得します。使用している実際のコードを投稿できますか? –

+0

私はメモ帳++で自分のコードを変更しました。実際の値は正しいです。私はできるだけジェネリックにしたいと思っていました。それがエラーの理由ではありませんでした。私はそれ以来、問題の原因を見つけました。 – gsirianni

答えて

4

あなたは、出力パラメータを定義した - しかし、あなたはまた、.ExecuteNonQuery()にお電話した後それを読み出すか??残念ながら、あなたは基本的に、あなたが

SqlCommand cmd = new SqlCommand(..., connection); ..... 

// set up your parameter as above 

connection.Open(); 
cmd.ExecuteNonQuery(); 

var outputValue = cmd.Parameters["@APID"].Value; // you need to read it out! 

connection.Close(); 

を必要とするあなたはこれをやっている...

をそのコードを示していません?そして、それはあなたがいつも0を得ているところですね?

出力パラメータはではない.ExecuteNonQuery()コールからの戻り値 - 呼び出し後にパラメータ値を明示的に読み取る必要があります。

+0

はい私はこのコードをどこで実行していますか。 APID = Convert.ToInt32(sqlCommand.Parameters ["@ APID"]。値);ブレークポイントを設定してこの値を取得すると、NULLになります。したがってConvert.ToInt32は0に設定します。 – gsirianni

+1

私はあなたがすでに提案したすべてを持っていましたが、私は本当の問題を発見できなかったので、私は助けてくれました。 51個のパラメータがあり、そのうちの1つがデフォルトでNULLに設定されていないため、ステートメントが失敗して0が返されます。 – gsirianni

関連する問題