3

単純なSQLServerストアドプロシージャがあります。

ALTER PROCEDURE GetRowCount

(
@count int=0 OUTPUT
)

AS
Select * from Emp where age>30;
SET @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.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int));
cmd.Parameters["@count"].Direction = ParameterDirection.Output;
con.Open();
SqlDataReader reader=cmd.ExecuteReader();
int ans = (int)cmd.Parameters["@count"].Value;
Console.WriteLine(ans);

ただし、コードを実行すると、コードの最後から2番目の行にNullReferenceExceptionがスローされます。どこが間違っているのですか?前もって感謝します!

PS私はSQLプロシージャを初めて使用するので、この記事を参照しました。

4

5 に答える 5

12

適切な廃棄が保証されるように、ブロックを使用するSqlConnectionことをお勧めします。SqlCommand

また、私が間違っていない場合、出力パラメーターは、返される結果のデータセットを完全に読み取った後でのみ使用できます。

あなたはそれをまったく必要としないように思われるので、なぜ.ExecuteNonQuery()代わりに使用しないのですか?それで問題は解決しますか?

using (SqlConnection con = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=answers;Integrated Security=True"))
using (SqlCommand cmd = new SqlCommand("dbo.GetRowCount", con))
{
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int));
    cmd.Parameters["@count"].Direction = ParameterDirection.Output;

    con.Open();
    cmd.ExecuteNonQuery();  // *** since you don't need the returned data - just call ExecuteNonQuery
    int ans = (int)cmd.Parameters["@count"].Value;
    con.Close();

    Console.WriteLine(ans);
}

また、行数にのみ関心があるように思われるので、ストアドプロシージャを次のように単純化してみませんか。

ALTER PROCEDURE GetRowCount
AS
   SELECT COUNT(*) FROM Emp WHERE age > 30;

次に、C#コードでこのスニペットを使用します。

    con.Open();

    object result = cmd.ExecuteScalar();

    if(result != null)
    {
        int ans = Convert.ToInt32(result);
    }

    con.Close();
于 2012-08-29T09:11:16.840 に答える
1

ExecuteNonQueryを使用するだけです。この場合、パラメータなしでExecuteReaderを使用することはできません。

cmd.ExecuteNonQuery(); 

または、ExecuteScalarとReturnValueを試してみたい場合

于 2012-08-29T09:10:47.153 に答える
1

クエリではなくストアドプロシージャであることを指定する必要があります

cmd.CommandType = CommandType.StoredProcedure;
于 2012-08-29T09:11:32.233 に答える
0

追加する必要があります

cmd.CommandType = CommandType.StoredProcedure 

それを呼び出す前に

于 2012-08-29T09:10:28.080 に答える
0

問題、その接続文字列を見つけました。しかし今、コードでは:

 usuary = (string)cmd.Parameters["@USUARIO"].Value;
password = (string)cmd.Parameters["@CLAVE"].Value;

値がnullであるコンパイラ情報。

于 2013-07-15T05:37:42.630 に答える