11

使用下面的方法,我试图返回一个由存储过程返回的整数,它返回值 0 或大于零。据我了解,当返回数据时,它将是一个字典(不确定),因为我试图返回一个整数。我怎样才能做到这一点。下面的代码是不完整的,注释中的代码是我最初所做的,我意识到我可以用更简单的方式重写相同的代码。我把他们两个都留在那里了,所以我错了,有人可以解决我,谢谢。

public int Exists(string plan)
{
    using (var connection = new SqlConnection(Connection))
    {
        connection.Open();
       var parameters = new DynamicParameters();
       //parameters.Add("@Plan", plan, DbType.String,
           //ParameterDirection.Input, null);
           //I guess I can directly pass param but not sure how ??

        var data=connection.Query("storeProcmem_Plan", new{ ? ?},
               CommandType.StoredProcedure);

        //how to return an integer               
        int myvalue= data ???                


        connection.Close();
        return Convert.ToInt32(data);
4

1 回答 1

15

假设您的参数是固定的(它们通常用于存储过程 - 您需要的主要时间DynamicParameters是如果您正在生成 SQL on-the=fly 以匹配一些复杂的灵活查询) - 那么参数方面很简单:

new { Plan = plan }

这使用编译器的匿名类型特性来定义参数应该被命名Plan,是类型string,并且具有从变量中获取的值plan

如果我们假设存储过程是单行中select的结果(而不是return需要单独编码的),那么最简单的读取方法是:

var myvalue = connection.Query<int>("storeProcmem_Plan", new { Plan = plan },
           CommandType.StoredProcedure).First();

通用与非通用 API 在类型化结果和dynamic结果之间切换 - 两者都有用途,但<int>在这里似乎合适。这.First()是标准的 LINQ 操作,通过选择第一个值(如果没有,则抛出异常)从 转换为 - 您也可以使用IEnumerable<T>,或,具体取决于您想要的确切语义。TSingle()FirstOrDefault()SingleOrDefault()

为了完整起见,如果您使用的是非通用 API,那么您需要知道列名- 基本上,这将是:

dynamic row = connection.Query("storeProcmem_Plan", new { Plan = plan },
       CommandType.StoredProcedure).First();
int myvalue = row.ColumnName;
于 2013-09-10T07:06:25.307 回答