Как получить скалярное значение из хранимой процедуры (ADO.NET) - PullRequest
7 голосов
/ 25 июня 2009

Если в хранимой процедуре я просто выполняю одну инструкцию select count(*) from sometable, то на стороне клиента (я использую C # ADO.Net SqlCommand для вызова хранимой процедуры), как я могу получить значение count(*)? Я использую SQL Server 2008.

Я запутался, потому что count(*) не используется в качестве параметра возвращаемого значения хранимой процедуры.

спасибо заранее, George

Ответы [ 3 ]

7 голосов
/ 25 июня 2009

Либо вы используете ExecuteScalar, как предложил Эндрю, либо вам придется немного изменить свой код:

CREATE PROCEDURE dbo.CountRowsInTable(@RowCount INT OUTPUT)
AS BEGIN
  SELECT
    @RowCount = COUNT(*)
  FROM 
    SomeTable
END

, а затем используйте этот вызов ADO.NET для получения значения:

using(SqlCommand cmdGetCount = new SqlCommand("dbo.CountRowsInTable", sqlConnection))
{
  cmdGetCount.CommandType = CommandType.StoredProcedure;

  cmdGetCount.Parameters.Add("@RowCount", SqlDbType.Int).Direction = ParameterDirection.Output;

  sqlConnection.Open();

  cmdGetCount.ExecuteNonQuery();

  int rowCount = Convert.ToInt32(cmdGetCount.Parameters["@RowCount"].Value);

  sqlConnection.Close();
}

Марк

PS: но в этом конкретном примере, я думаю, альтернатива с простым выполнением ExecuteScalar проще и понятнее. Этот метод может работать нормально, если вам нужно вернуть более одного значения (например, подсчет из нескольких таблиц или около того).

6 голосов
/ 25 июня 2009

Когда вы выполняете запрос запроса ExecuteScalar - это вернет результат.

Выполняет запрос и возвращает первый столбец первой строки в наборе результатов, возвращенных запросом. Дополнительные столбцы или строки игнорируются.

Поскольку вы возвращаете только одно значение, это вернет только значение из вашего выражения count. Вам нужно будет привести результат этого метода к int.

1 голос
/ 27 августа 2010

marc_s ответ работал нормально для целых чисел. но для varchar длина должна быть указана.

cmdGetCount.Parameters.Add("@RowCount", SqlDbType.varchar,30).Direction = ParameterDirection.Output;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...