Хранимая процедура:
ALTER PROCEDURE VendorsRowcount
@RowCount int OUTPUT
AS
SET NOCOUNT ON
SELECT *
FROM dbo.Vendors
SET @RowCount = @@ROWCOUNT
RETURN @RowCount
С#:
using (var conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Pricer;Persist Security Info=True;User ID=xxx;Password=xxx"))
using (var command = new SqlCommand("VendorsRowcount", conn)
{
CommandType = CommandType.StoredProcedure
})
{
conn.Open();
command.ExecuteNonQuery();
conn.Close();
}
Я получаю сообщение об ошибке:
Дополнительная информация: Процедура или функция "VendorsRowcount" ожидает параметра "@RowCount", который не был предоставлен.
Я просто изучаю С# после того, как узнал VB и понял, что в С# есть больше ресурсов в Интернете.
Это, наверное, глупый вопрос, но я искал и, возможно, термины, которые я использую, не являются правильными, потому что я не могу найти ответ.
Насколько мне известно, мне не нужно отправлять параметр, потому что @RowCount
.
Почему я получаю эту ошибку?
Если вы объявляете параметр в хранимой процедуре, он не имеет значения тот факт, что объявлен как OUTPUT. Вам нужно передать его с вашего кода на С#. Альтернативой является объявление параметра как необязательного, как показано в другом ответе. Однако у вас есть проблема. Как вы читаете в своем коде С# значение этого параметра?
Первый вариант, передать параметр в хранимой процедуре и прочитать его обратно
conn.Open();
SqlParameter prm = command.Parameters.Add(new SqlParameter("@RowCount", SqlDbType.Int));
prm.Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
Console.WriteLine(prm.Value.ToString());
conn.Close();
Второй параметр, установите параметр как необязательный, вызовите метод SqlCommandBuilder.DeriveParameters, чтобы заполнить коллекцию параметров на стороне С# и прочитать ее обратно. (Пожалуйста, прочитайте раздел замечаний в ссылке, приведенной об эффективности этого решения)
-- in the stored procedure
@RowCount int = 0 OUTPUT
conn.Open();
SqlCommandBuilder.DeriveParameters(command);
command.ExecuteNonQuery();
Console.WriteLine(command.Parameters["@RowCount"].Value.ToString());
conn.Close();
Однако меня озадачивает тот факт, что вы запускаете потенциально дорогостоящую команду SELECT *
но вам не кажется, что вас интересуют возвращенные записи.
В этом контексте StoredProcedure кажется чрезмерным и добавляет проблему обслуживания, в то время как вы можете просто вычислить количество строк:
conn.Open();
command.CommandText = "SELECT COUNT(*) FROM Vendors";
int rowCount = Convert.ToInt32(command.ExecuteScalar());
Console.WriteLine(rowCount.ToString());
conn.Close();
Вам нужно передать этот параметр. Вот хороший пример того, как это сделать:
Если параметр должен быть необязательным, вы должны указать значение по умолчанию в своей хранимой процедуре.
Например: @RowCount int OUTPUT = 0
@RowCount
в вашем sp?