如何使用存储过程DbContext.Database.SqlQuery <TElement>(sql,params)? EF代码第一CTP5

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

context.Database.SqlQuery<myEntityType>("mySpName", param1, param2, param3); 

起初我尝试使用SqlParameter对象作为参数,但是这不起作用,并抛出一个SqlException与下面的消息:

过程或函数“mySpName”需要参数“@ param1”,它没有提供。

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

谢谢。

你应该以下面的方式提供SqlParameter实例:

 context.Database.SqlQuery<myEntityType>( "mySpName @param1, @param2, @param3", new SqlParameter("param1", param1), new SqlParameter("param2", param2), new SqlParameter("param3", param3) ); 

另外,您可以使用“sql”参数作为格式说明符:

 context.Database.SqlQuery<MyEntityType>("mySpName @param1 = {0}", param1) 

此解决scheme(仅)适用于SQL Server 2005

你们是救命的人,但正如@丹·莫克所说,你们需要把EXECjoin到组合中去。 绊倒我的是:

  • Proc名称前的'EXEC'
  • 逗号之间的参数
  • 在参数定义上砍掉'@'(不确定这个位是否需要)。

 context.Database.SqlQuery<EntityType>( "EXEC ProcName @param1, @param2", new SqlParameter("param1", param1), new SqlParameter("param2", param2) ); 
 return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}", new object[] { param1, param2, param3 }); 

//要么

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

//要么

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

//要么

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

我用这个方法:

 var results = this.Database.SqlQuery<yourEntity>("EXEC [ent].[GetNextExportJob] {0}", ProcessorID); 

我喜欢它,因为我只是放在Guid和date时间和SqlQuery执行所有格式为我。

@Tom Halladay的答案是正确的,提到你shopuld也检查空值,并发送DbNullable如果参数为空,因为你会得到一个exception

参数化查询“…”需要参数“@parameterName”,该参数未提供。

像这样的东西帮助了我

 public static object GetDBNullOrValue<T>(this T val) { bool isDbNull = true; Type t = typeof(T); if (Nullable.GetUnderlyingType(t) != null) isDbNull = EqualityComparer<T>.Default.Equals(default(T), val); else if (t.IsValueType) isDbNull = false; else isDbNull = val == null; return isDbNull ? DBNull.Value : (object) val; } 

(该方法的功劳去https://stackoverflow.com/users/284240/tim-schmelter

然后像这样使用它:

 new SqlParameter("@parameterName", parameter.GetValueOrDbNull()) 

或另一种解决scheme,更简单,但不是通用的将是:

 new SqlParameter("@parameterName", parameter??(object)DBNull.Value) 

当我使用SELECT语句调用一个带有两个input参数的存储过程并返回3个值时,我有相同的错误消息,并且我在EF Code First方法中解决了下面的问题

  SqlParameter @TableName = new SqlParameter() { ParameterName = "@TableName", DbType = DbType.String, Value = "Trans" }; SqlParameter @FieldName = new SqlParameter() { ParameterName = "@FieldName", DbType = DbType.String, Value = "HLTransNbr" }; object[] parameters = new object[] { @TableName, @FieldName }; List<Sample> x = this.Database.SqlQuery<Sample>("EXEC usp_NextNumberBOGetMulti @TableName, @FieldName", parameters).ToList(); public class Sample { public string TableName { get; set; } public string FieldName { get; set; } public int NextNum { get; set; } } 

更新 :它看起来像SQL SERVER 2005缺lessEXEC关键字正在创build问题。 因此,为了让它能够与所有的SQL SERVER版本一起工作,我更新了我的答案,并在下面添加了EXEC

  List<Sample> x = this.Database.SqlQuery<Sample>(" EXEC usp_NextNumberBOGetMulti @TableName, @FieldName", parameters).ToList(); 

大多数答案都是脆弱的,因为它们依赖于SP参数的顺序。 更好地命名存储过程的参数,并给这些参数化的值。

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

使用带有ExecuteStoreQuery和ExecuteStoreCommand的SQL Server命名参数

介绍最佳方法。 比丹·莫克的答案在这里更好。

  • 不依赖连接string,也不依赖SP中定义的参数顺序。

例如:

 var cmdText = "[DoStuff] @Name = @name_param, @Age = @age_param"; var params = new[]{ new SqlParameter("name_param", "Josh"), new SqlParameter("age_param", 45) }; context.Database.SqlQuery<myEntityType>(cmdText, params) 
 db.Database.SqlQuery<myEntityType>("exec GetNewSeqOfFoodServing @p0,@p1,@p2 ", foods_WEIGHT.NDB_No, HLP.CuntryID, HLP.ClientID).Single() 

@ P0,P1 @,@ P2 ……
要么

 db.Database.SqlQuery<myEntityType>( "exec GetNewSeqOfFoodServing @param1, @param2", new SqlParameter("param1", param1), new SqlParameter("param2", param2) ); 

要么

 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) 

要么

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