Visual C # хранимая процедура, запрашивающая параметр, который не нужен

1

Хранимая процедура:

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.

Почему я получаю эту ошибку?

  • 3
    Но у вас есть @RowCount в вашем sp?
Теги:
sql-server-2008

3 ответа

3
Лучший ответ

Если вы объявляете параметр в хранимой процедуре, он не имеет значения тот факт, что объявлен как 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();
  • 0
    Это сработало идеально. И я знаю, что мой код делает / будет плохим. Я сетевой техник, а не программист. Моя работа только что сказала мне стать программистом, поэтому я пытаюсь. У меня около 3 недель опыта работы с VB, и я в свой первый день возиться с C #. Я уверен, что есть еще много глупых вопросов.
  • 0
    Это выглядит так же сложно, как просто набрать запрос. Я использовал хранимые процедуры, потому что думал, что они сэкономят время.
Показать ещё 2 комментария
2

Вам нужно передать этот параметр. Вот хороший пример того, как это сделать:

Получить значение выходного параметра в ADO.NET

1

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

Например: @RowCount int OUTPUT = 0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню