3

シンプルな SQL Server ストアド プロシージャがあります。

ALTER PROCEDURE GetRowCount

(
@count int=0 OUTPUT
)

AS
Select * from Emp where age>30;
SET @count=@count+@@ROWCOUNT;

RETURN

次の C# コードで、出力パラメーターを初期化してアクセスしようとしています。

SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=answers;Integrated Security=True";

SqlCommand cmd = new SqlCommand();
cmd.Connection = con;

cmd.CommandText = "GetRowCount";
cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int));
cmd.Parameters["@count"].Direction = ParameterDirection.Output;
con.Open();
cmd.Parameters["@count"].Value=5;
cmd.ExecuteNonQuery();

int ans = (int)(cmd.Parameters["@count"].Value);
Console.WriteLine(ans);

しかし、コードを実行すると、コードのInvalidCastException最後の 2 行目で an がスローされます (Value 属性に何も返されないことをデバッグして確認しました)。

コードで出力パラメータを正しく初期化するにはどうすればよいですか? 前もって感謝します!

4

2 に答える 2

6

ParameterDirection をに変更する必要がありますParameterDirection.InputOutput

例については、こちらをご覧ください:プロシージャ sql サーバー 2005 から c# への戻り値を取得する方法

于 2012-08-29T10:34:16.433 に答える
1

outputパラメータを初期化する必要はありません。ParameterDirection.InputOutput値をストアドプロシージャに渡すために使用します。

タイプ例外の最も可能性の高い原因は、プロシージャがを返すことDBNull.Valueです。あなたはそれを次のようにテストすることができます:

var ans = cmd.Parameters["@count"].Value as int?;
于 2012-08-29T10:38:09.590 に答える