268

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

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

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

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

所以我的问题是如何将此方法与需要参数的存储过程一起使用?

谢谢。

4

10 回答 10

415

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

context.Database.SqlQuery<myEntityType>(
    "mySpName @param1, @param2, @param3",
    new SqlParameter("param1", param1),
    new SqlParameter("param2", param2),
    new SqlParameter("param3", param3)
);
于 2011-02-02T12:42:25.773 回答
130

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

context.Database.SqlQuery<MyEntityType>("mySpName @param1 = {0}", param1)
于 2011-06-19T17:15:16.907 回答
71

This solution is (only) for SQL Server 2005

You guys are lifesavers, but as @Dan Mork said, you need to add EXEC to the mix. What was tripping me up was:

  • 'EXEC ' before the Proc Name
  • Commas in between Params
  • Chopping off '@' on the Param Definitions (not sure that bit is required though).

:

context.Database.SqlQuery<EntityType>(
    "EXEC ProcName @param1, @param2", 
    new SqlParameter("param1", param1), 
    new SqlParameter("param2", param2)
);
于 2011-09-22T17:15:46.000 回答
17
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();
}
于 2012-10-18T14:36:13.993 回答
10

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

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

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

描述最佳方法。比 Dan Mork 在这里的回答要好。

  • 不依赖于连接字符串,也不依赖于 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)
于 2017-09-07T21:30:01.980 回答
6
db.Database.SqlQuery<myEntityType>("exec GetNewSeqOfFoodServing @p0,@p1,@p2 ", foods_WEIGHT.NDB_No, HLP.CuntryID, HLP.ClientID).Single()

或者

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();
于 2017-10-15T08:02:10.280 回答
3

我使用这种方法:

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

我喜欢它,因为我只是放入 Guid 和 Datetimes,SqlQuery 为我执行所有格式设置。

于 2012-02-27T15:14:00.130 回答
1

@Tom Halladay 的回答是正确的,提到您还可以检查 null 值并在参数为 null 时发送 DbNullable ,因为您会收到类似的异常

参数化查询“...”需要未提供的参数“@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())

或另一种更简单但不通用的解决方案是:

new SqlParameter("@parameterName", parameter??(object)DBNull.Value)
于 2017-05-10T12:32:01.980 回答
0

当我使用 SELECT 语句调用带有两个输入参数并返回 3 个值的存储过程时,我遇到了相同的错误消息,我在 EF Code First Approach 中解决了如下问题

 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 缺少 EXEC 关键字正在造成问题。因此,为了让它适用于所有 SQL SERVER 版本,我更新了我的答案并在下面的行中添加了EXEC

 List<Sample> x = this.Database.SqlQuery<Sample>(" EXEC usp_NextNumberBOGetMulti @TableName, @FieldName", param).ToList();
于 2014-03-19T22:11:26.080 回答
0

我像这样使用 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.
于 2019-10-03T17:37:41.800 回答