sql >> Databasteknik >  >> RDS >> Sqlserver

Åtkomst till SQL Server lagrad procedur utdataparameter i C#

Jag skulle föreslå att du lägger din SqlConnection och SqlCommand att använda block så att deras korrekt bortskaffande garanteras.

Dessutom, om jag inte har fel, är utdataparametrarna endast tillgängliga efter att du helt har läst den resulterande datamängden som returneras.

Eftersom du inte verkar behöva det alls - varför inte bara använda .ExecuteNonQuery() istället? Löser det problemet?

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);
}

Dessutom:eftersom det verkar som att du bara verkligen är intresserad av radantalet - varför inte förenkla din lagrade procedur till något i stil med detta:

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

och använd sedan detta utdrag i din C#-kod:

    con.Open();

    object result = cmd.ExecuteScalar();

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

    con.Close();


  1. Hur man gör unika begränsningar fungerar med NULL-värde i MySQL

  2. Postgres CSV COPY from/import respekterar inte CSV-rubriker

  3. Beräknat fältvärde baserat på annan kolumn vid infogning

  4. Returnera alla inaktiverade begränsningar i SQL Server (T-SQL-exempel)