2014-08-28 2 views
1

Моя сохраненная процедура просто возвращает string. Например: Эта хранимая процедура возвращает "en-US"Как пользователь dapper отображает простую хранимую процедуру в C#?

CREATE PROCEDURE [dbo].[P_GetStringConfig]( 
    @iCode CHAR(20)) 
AS 
BEGIN 
    SET NOCOUNT ON 

    SELECT Value 
    FROM T_SReq_Config WITH (NOLOCK) 
    WHERE Code = @iCode 

    IF @@ERROR <> 0 
    RETURN @@ERROR 

    RETURN 0 
END 

Я использую Dapper так:

using (var connection = new SqlConnection(GetConnectionString())) 
      { 
       var result = connection.Query<ModelClass>(
                "P_GetStringConfig", 
                new {@iCode = "MCode"}, 
                commandType:  CommandType.StoredProcedure).First(); 
      } 

где мой ModelClass является

class ModelClass 
{ 
    string result {get;set;} 
} 

Но получение null.

Любые идеи, что мне здесь не хватает? (Или есть другой способ назвать это?)

+0

Да, это должен быть «P_GetStringConfig» в методе запроса dapper, или это была только опечатка в этом вопросе, но не в вашем фактическом коде? – Dirk

+0

@ Dirk: Извините, это была «опечатка». Обновлен вопрос. –

+0

Вы хотите получить результат запроса select или результат оператора return? – Dirk

ответ

2

Вероятно, вы должны иметь свой результат свойства с именем в поле возвращаемого SP (значение), но это создает конфликт с зарезервированным ключевым словом

Таким образом, изменение СП переименовать поле возвращается как свойство модели

CREATE PROCEDURE [dbo].[P_GetStringConfig]( 
    @iCode CHAR(20)) 
AS 
BEGIN 
    SET NOCOUNT ON 

    SELECT Value AS result 
    FROM T_SReq_Config WITH (NOLOCK) 
    WHERE Code = @iCode 

    IF @@ERROR <> 0 
    RETURN @@ERROR 

    RETURN 0 
END 

Кроме того, я предлагаю, чтобы изменить код, чтобы использовать FirstOrDefault в случае, если ваш SP не находит ничего код сгенерирует исключение

var result = connection.Query<ModelClass>("P_GetStringConfig", 
              new {@iCode = "MCode"}, 
              commandType:CommandType.StoredProcedure) 
              .FirstOrDefault(); 
+0

Спасибо. Собираюсь попробовать это сейчас. BTW, 'Query ' всегда возвращает 'List '? Вернет ли он теперь только 'T'? Потому что 'SP' просто возвращает простое значение' string'? –

+1

@nowhewhomustnotbenamed, если все, что вам нужно, это одно строковое значение, тогда 'Query (...). SingleOrDefault()' будет работать отлично, и ** не имеет значения, что такое имя столбца **. Остерегайтесь там: вы не сможете сказать разницу между «ни одной строкой» и «одной строкой с нулевым значением», –

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