让我们假设我有一个有效的需要直接执行实体框架中的sql命令。我很难弄清楚如何在我的sql语句中使用参数。下面的例子(不是我的真实例子)不起作用。
var firstName = "John";
var id = 12;
var sql = @"Update [User] SET FirstName = @FirstName WHERE Id = @Id";
ctx.Database.ExecuteSqlCommand(sql, firstName, id);
ExecuteSqlCommand方法不允许像ADO那样传入命名参数。Net和此方法的文档没有给出如何执行参数化查询的任何示例。
如何正确地指定参数?
如果您的底层数据库数据类型是varchar,那么您应该坚持下面的方法。否则,该查询将对性能产生巨大影响。
var firstName = new SqlParameter("@firstName", System.Data.SqlDbType.VarChar, 20)
{
Value = "whatever"
};
var id = new SqlParameter("@id", System.Data.SqlDbType.Int)
{
Value = 1
};
ctx.Database.ExecuteSqlCommand(@"Update [User] SET FirstName = @firstName WHERE Id = @id"
, firstName, id);
您可以检查Sql分析器来查看差异。
你可以:
1)传递原始参数并使用{0}语法。例句:
DbContext.Database.SqlQuery("StoredProcedureName {0}", paramName);
2)传递DbParameter子类参数并使用@ParamName语法。
DbContext.Database.SqlQuery("StoredProcedureName @ParamName",
new SqlParameter("@ParamName", paramValue);
如果使用第一种语法,EF实际上会用dbparameter类包装参数,为它们分配名称,并用生成的参数名称替换{0}。
首选第一种语法,因为您不需要使用工厂或知道要创建什么类型的dbparameters (SqlParameter, oracleparameter,等等)。