2014-08-28 42 views
1

我的存储过程只是返回一个string。例如:此存储过程返回"en-US"如何使用简洁的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”,或者仅仅是这个问题中的错字,而不是实际的代码中的错字? – Dirk 2014-08-28 09:32:30

+0

@Dirk:对不起,这是一个'打字错误'。更新了问题。 – 2014-08-28 09:39:05

+0

你想要选择查询的结果还是返回语句的结果? – Dirk 2014-08-28 09:41:24

回答

2

也许你应该把你的财产的结果评为由SP(值)返回的字段,但是这将创建一个保留关键字冲突

所以,变化重命名该领域的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

谢谢。现在就去尝试一下。顺便说一下,'Query '总是返回一个'List '?现在它只会返回一个'T'吗?因为,'SP'只是返回一个简单的'string'值? – 2014-08-28 09:45:00

+1

@nowhewhomustnotbenamed如果你想要的是一个字符串值,然后'查询(...)的SingleOrDefault()'会很好地工作,而**不要紧列名是什么**。一个警告:你将无法区分“无行”和“有空值的行” – 2014-08-28 10:03:25