使用下面的方法我试图返回一个intger,它由存储过程返回,它返回值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);
答案 0 :(得分:13)
假设您的参数是固定的(它们通常用于存储过程 - 您需要DynamicParameters
的主要时间是,如果您在= -fly上生成SQL以匹配某些复杂的灵活查询) - 那么参数方面很简单:
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>
转换为T
- 您也可以使用{{1} }},Single()
或FirstOrDefault()
取决于您想要的确切语义。
为了完整性,如果您使用的是非通用API,那么您需要知道列名称 - 基本上就是:
SingleOrDefault()