これは私が後で自分自身を叩くところの質問ではないと思うが、これは本当に混乱している。私はこれが私のストアドプロシージャの別のもののために働いているので、これはとても混乱しています。それは基本的に両方の設定が同じです。ここで何が起こっているのですか?出力変数がSQL Serverストアドプロシージャに設定されていない
ここに私のストアドプロシージャの例です:今
ALTER PROCEDURE [dbo].[CreateRecord]
-- Add the parameters for the stored procedure here
@Link1Id INT = NULL,
@Link2Id INT = NULL,
@Amount MONEY,
@Output int out
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET @Output = 0
-- Insert statements for procedure here
IF @Link1Id = NULL
BEGIN
IF NOT EXISTS(SELECT * FROM dbo.Records WHERE Link2Id = @Link2Id)
INSERT INTO [dbo].[Records]
([Link1Id]
,[Link2Id])
VALUES
(@Link1Id
,@Link2Id)
SET @Output = (SELECT RecordId FROM dbo.Records WHERE Link2Id = @Link2Id)
END
ELSE
BEGIN
IF NOT EXISTS(SELECT * FROM dbo.Records WHERE Link1Id = @Link1Id)
INSERT INTO [dbo].[Records]
([Link1Id]
,[Link2Id])
VALUES
(@Link1Id
,@Link2Id)
SET @Output = (SELECT RecordId FROM dbo.Records WHERE Link1Id = @Link1Id)
END
END
、私は基本的に、この手順を実行し、返された@Output
が0よりも大きいが、@Output
パラメータであることをAssert
しようとするユニットテストを作成しましたコード内のSqlCommand
の値は決してありません。私は、次の行にそれをExecuteNonQuery()
を呼び出す行をステップオーバー、および新しい(そして正しい)レコードがあるデータベースで確認することができますが、今
private int ExecuteNonQueryWithOutput(string procedureName, SqlParameter[] parameters)
{
SqlCommand command = this.GenerateCommand(procedureName, parameters);
connection.Open();
command.ExecuteNonQuery();
int retval = (int)command.Parameters[OUTPUT].Value;
connection.Close();
return retval;
}
:ここではC#のコードの一部ですValue
が存在しないため、(int)command.Parameters[OUTPUT].Value;
を呼び出すと例外がスローされます。
これは、同じ正確な方法でセットアップされている別の手順では完全に動作しています。なぜここではうまくいかないのか知っていますか?
ありがとうございました。私は運がないとしばらくデバッグしました。
編集:パラメータの配列を生成
コード:
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter { ParameterName = "@Link1Id", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = link1Val });
parameters.Add(new SqlParameter { ParameterName = "@Link2Id", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = link2Val });
parameters.Add(new SqlParameter { ParameterName = OUTPUT, SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output });
return this.ExecuteNonQueryWithOutput("CreateRecord", parameters.ToArray());
ここで実際にprocに渡すパラメータを定義していますか? – NotMe
'@ Output'は宣言する必要がありますか? – jp2code
@ChrisLively私はそれらが 'parameters'配列に入っていると思います。もっと重要なのは 'set @ output = 0'だけですが、どこにでも宣言していません。 –