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

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)
);

其他回答

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

我用的是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.

@Tom Halladay的回答是正确的,提到你也可以检查空值,如果参数为空,就发送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)

当我使用SELECT语句调用一个接受两个输入参数并返回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缺少的EXEC关键字正在创建问题。因此,为了允许它与所有SQL SERVER版本一起工作,我更新了我的答案,并在下面添加了EXEC

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

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

你们都是救星,但就像丹·莫克说的,你们需要加入EXEC。让我困惑的是:

“EXEC”在Proc名称之前 参数之间的逗号 砍掉Param上的“@” 定义(但不确定该位是必需的)。

:

context.Database.SqlQuery<EntityType>(
    "EXEC ProcName @param1, @param2", 
    new SqlParameter("param1", param1), 
    new SqlParameter("param2", param2)
);