Возвращение скаляра из SQL Server в C # - PullRequest
1 голос
/ 15 июля 2011

Я пытаюсь вернуть скаляр из базы данных следующим образом:

DbConnection cn = GetConnection2();
cn.Open();

// stored procedure
DbCommand cmd = GetStoredProcCommand(cn, "GetReason");
DbParameter param;

param = CreateInParameter("Reason_Number", DbType.String);
param.Value = number;
cmd.Parameters.Add(param);

param = CreateOutParameter("Result", DbType.String);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);

cmd.ExecuteScalar();

string reason;
reason = cmd.Parameters["@Result"].Value.ToString();

if (cn.State == ConnectionState.Open)
   cn.Close();

return reason;

Вот моя хранимая процедура:

-- =============================================
-- Create date: Today
-- Description: Input Reason # and Return Full Reason Name
-- =============================================
ALTER PROCEDURE [dbo].[GetReason]
    @Reason_Number nvarchar(50),
    @Result nvarchar(50) output  
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT @Result = Field1 
    FROM dbo.Reasons
    WHERE Field1 LIKE @Reason_Number + '%';
END

Я получаю сообщение об ошибке в строке ExecuteScalar:

Произошла исключительная ситуация System.InvalidOperationException
Сообщение = "Строка [1]: недопустимый размер свойства« 0 ».»

Что я делаю неправильно

Ответы [ 2 ]

4 голосов
/ 15 июля 2011

Если вы хотите использовать ExecuteScalar, ваш сохраненный процесс должен вернуть одну строку, один столбец из SELECT:

ALTER PROCEDURE [dbo].[GetReason]
    @Reason_Number nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT Field1 
    FROM dbo.Reasons
    WHERE Field1 LIKE @Reason_Number + '%';
END

, а затем ваш код должен прочитать это значение:

var returnedValue = cmd.ExecuteScalar();

и используйте его оттуда.Конечно, в этом случае вам также не нужен параметр OUTPUT в вашем коде C # ....

Слово предупреждения: что SELECT в вашем хранимом процессе может потенциально вернутьнесколько рядов.Возможно, вы захотите добавить TOP 1 к вашему выбору - просто для безопасности:

    SELECT TOP 1 Field1 
    FROM dbo.Reasons
    WHERE Field1 LIKE @Reason_Number + '%';
1 голос
/ 15 июля 2011

Просто добавьте еще один оператор в конец вашей хранимой процедуры и удалите OUTPUT параметр

SELECT @Result as 'Result'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...