如何使用存储过程DbContext.Database.SqlQuery <TElement>(sql,params)?EF Code First CTP5

ele*_*eep 240 c# sql ado.net linq-to-entities entity-framework-ctp5

我有一个存储过程有三个参数,我一直在尝试使用以下命令返回结果:

context.Database.SqlQuery<myEntityType>("mySpName", param1, param2, param3);
Run Code Online (Sandbox Code Playgroud)

起初我尝试使用SqlParameter对象作为参数,但这不起作用并抛出SqlException以下消息:

过程或函数'mySpName'需要参数'@ param1',这是未提供的.

所以我的问题是你如何使用这个方法与期望参数的存储过程?

谢谢.

Dev*_*art 371

您应该以下列方式提供SqlParameter实例:

context.Database.SqlQuery<myEntityType>(
    "mySpName @param1, @param2, @param3",
    new SqlParameter("param1", param1),
    new SqlParameter("param2", param2),
    new SqlParameter("param3", param3)
);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用\ @ p#语法来避免在context.Database.SqlQuery <myEntityType("mySpName\@ p0,\ @ p1,\ @ p2",param1,param2,param3)中使用SqlParameter.来源:http://msdn.microsoft.com/en-US/data/jj592907.(注意:必须使用\ @来避免用户通知,应该在没有反斜杠的情况下阅读.) (29认同)
  • 你如何使这个方法适用于可空类型?我尝试使用可以为空的小数,但当小数为空时,我得到错误,说参数丢失.但是,@ DanMork提到的方法可以找到. (3认同)
  • 如果使用DateTime参数,则还需要指定参数类型,而不仅仅是名称和值.例如:dbContext.Database.SqlQuery <Invoice>("spGetInvoices @dateFrom,@ dateTo",new SqlParameter {ParameterName ="dateFrom",SqlDbType = SqlDbType.DateTime,Value = startDate},new SqlParameter {ParameterName ="dateTo", SqlDbType = SqlDbType.DateTime,Value = endDate}); 另一个重要的事情是尊重参数的顺序. (3认同)
  • 传递`DbNull.Value`而不是nulls会解决问题吗? (2认同)

Dan*_*ork 126

此外,您可以使用"sql"参数作为格式说明符:

context.Database.SqlQuery<MyEntityType>("mySpName @param1 = {0}", param1)
Run Code Online (Sandbox Code Playgroud)

  • 这个语法让我有点担心.是否容易受到SQL注入?我假设EF正在运行"EXEC mySpName @Param1 =",并且可以发送"x'GO [恶意脚本]"并导致一些问题? (10认同)
  • @TomHalladay没有SQL注入的风险 - 该方法仍会根据其类型引用和转义参数,与@ style params相同.因此,对于字符串参数,您将在语句中使用"SELECT*FROM Users WHERE email = {0}"而不带引号. (10认同)

Tom*_*day 71

此解决方案(仅)用于SQL Server 2005

你们是救生员,但正如@Dan Mork所说,你需要在混合中加入EXEC.绊倒我的是:

  • Proc名称前的'EXEC'
  • Params之间的逗号
  • 在Param定义中删除'@'(不确定该位是否需要).

:

context.Database.SqlQuery<EntityType>(
    "EXEC ProcName @param1, @param2", 
    new SqlParameter("param1", param1), 
    new SqlParameter("param2", param2)
);
Run Code Online (Sandbox Code Playgroud)

  • +1.没有更高的投票答案包括`exec`,但我可以确认,如果我省略它,我会得到一个例外. (21认同)
  • 仅供参考:我不需要`exec`关键字.+1删除@上的参数,总是让我感到困惑. (2认同)

Thu*_*ram 13

return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
new object[] { param1, param2, param3 });
Run Code Online (Sandbox Code Playgroud)

//要么

using(var context = new MyDataContext())
{
return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
new object[] { param1, param2, param3 }).ToList();
}
Run Code Online (Sandbox Code Playgroud)

//要么

using(var context = new MyDataContext())
{
object[] parameters =  { param1, param2, param3 };

return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
parameters).ToList();
}
Run Code Online (Sandbox Code Playgroud)

//要么

using(var context = new MyDataContext())
{  
return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
param1, param2, param3).ToList();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你正在使用(var context = new MyDataContext())那么.ToList()是必需的. (2认同)

Don*_*dle 6

大多数答案都很脆弱,因为它们依赖于SP参数的顺序。最好命名存储的Proc的参数,并为其赋予参数化的值。

为了在调用SP时使用命名参数,而不必担心参数的顺序

将SQL Server命名参数与ExecuteStoreQuery和ExecuteStoreCommand一起使用

描述最佳方法。比丹·莫克的答案要好。

  • 不依赖于连接字符串,也不依赖于SP中定义的参数顺序。

例如:

var cmdText = "[DoStuff] @Name = @name_param, @Age = @age_param";
var sqlParams = new[]{
   new SqlParameter("name_param", "Josh"),
   new SqlParameter("age_param", 45)
};

context.Database.SqlQuery<myEntityType>(cmdText, sqlParams)
Run Code Online (Sandbox Code Playgroud)


Hos*_*deh 6

db.Database.SqlQuery<myEntityType>("exec GetNewSeqOfFoodServing @p0,@p1,@p2 ", foods_WEIGHT.NDB_No, HLP.CuntryID, HLP.ClientID).Single()
Run Code Online (Sandbox Code Playgroud)

或者

db.Database.SqlQuery<myEntityType>(
    "exec GetNewSeqOfFoodServing @param1, @param2", 
    new SqlParameter("param1", param1), 
    new SqlParameter("param2", param2)
);
Run Code Online (Sandbox Code Playgroud)

或者

var cmdText = "exec [DoStuff] @Name = @name_param, @Age = @age_param";
var @params = new[]{
   new SqlParameter("name_param", "Josh"),
   new SqlParameter("age_param", 45)
};

db.Database.SqlQuery<myEntityType>(cmdText, @params)
Run Code Online (Sandbox Code Playgroud)

或者

db.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
new object[] { param1, param2, param3 }).ToList();
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

296375 次

最近记录:

6 年,2 月 前