如何使用存储过程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();