2012-08-29 8 views
3

У меня есть простая хранимая процедура SQL Server:Доступа к SQL Server выходных параметры хранимой процедуры в C#

ALTER PROCEDURE GetRowCount 

(
@count int=0 OUTPUT 
) 

AS 
Select * from Emp where age>30; 
SET @[email protected]@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); 

Но при запуске кода исключение NullReferenceException выбрасывается во вторую последнюю строку кода. Где я иду не так? Заранее спасибо!

P.S. Я новичок в процедурах SQL, поэтому я упомянул this article.

+0

Анкита я обновил свой код, вы должны просто изменить директиву ExecuteNonQuery –

ответ

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(); 
+0

мой плохой, у меня есть эта строка в моем коде, но почему-то пропустила его здесь. Я отредактировал вопрос – ankit0311

+0

@ ankit0311: обновил мой ответ - попробуйте использовать '.ExecuteNonQuery()' - это исправляет проблему? –

+0

да, это исправлено :) – ankit0311

0

Вы должны добавить

cmd.CommandType = CommandType.StoredProcedure 

перед вызовом

1

Просто используйте ExecuteNonQuery, вы не можете использовать ExecuteReader с выводимым параметром в этом случае

cmd.ExecuteNonQuery(); 

Или, если вы хотите попробовать с ExecuteScalar и ReturnValue

+0

моих плохой, у меня есть эта линия в мой код, но почему-то пропустил его здесь. Я отредактировал вопрос – ankit0311

+0

i обновил мой код ankit 0311 –

1

вы должны указать, что это хранимая процедура не является запросом

cmd.CommandType = CommandType.StoredProcedure; 
+0

мой плохой, у меня есть эта строка в моем коде, но почему-то пропустила ее здесь. Я редактировал вопрос – ankit0311

0

Я нахожу проблему, ее строку подключения. Но теперь, в коде:

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

компилятор infomrs Thats значение равно нулем ...

Смежные вопросы