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

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

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

过程或函数“mySpName”需要未提供的参数“@param1”。

我的问题是如何将此方法用于期望参数的存储过程?

谢谢。


当前回答

大多数答案都是脆弱的,因为它们依赖于SP参数的顺序。最好是为Stored Proc的参数命名,并为它们提供参数化值。

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

使用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)

其他回答

大多数答案都是脆弱的,因为它们依赖于SP参数的顺序。最好是为Stored Proc的参数命名,并为它们提供参数化值。

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

使用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)
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();
}

同样,你可以使用"sql"参数作为格式说明符:

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

我用的是EF 6。X是这样的:

using(var db = new ProFormDbContext())
            {
                var Action = 1; 
                var xNTID = "A239333";

                var userPlan = db.Database.SqlQuery<UserPlan>(
                "AD.usp_UserPlanInfo @Action, @NTID", //, @HPID",
                new SqlParameter("Action", Action),
                new SqlParameter("NTID", xNTID)).ToList();


            }

不要在sqlparameter上重复使用,有些人会在变量上这样做

var Action = new SqlParameter("@Action", 1);  // Don't do this, as it is set below already.

我使用这个方法:

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

我喜欢它,因为我只是在Guids和Datetimes和SqlQuery执行所有的格式。