268

3つのパラメーターを持つストアドプロシージャがあり、次を使用して結果を返そうとしています。

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

このソリューションは(のみ)SQLServer2005用です

あなたたちは命の恩人ですが、@ Dan Morkが言ったように、EXECをミックスに追加する必要があります。私をつまずかせたのは:

  • Proc名の前の「EXEC」
  • パラメータ間のコンマ
  • パラメータ定義で「@」を切り落とします(ただし、ビットが必要かどうかはわかりません)。

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を呼び出すときに名前付きパラメータを使用するため

ExecuteStoreQueryおよびExecuteStoreCommandでSQLServerの名前付きパラメーターを使用する

最善のアプローチについて説明します。ここでのダン・モークの答えよりも優れています。

  • 文字列の連結に依存せず、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);

GuidsとDatetimesをドロップするだけで、SqlQueryがすべての書式設定を実行するので気に入っています。

于 2012-02-27T15:14:00.130 に答える
1

@Tom Halladayの答えは正しいです。また、null値をチェックし、paramsが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

2つの入力パラメーターを受け取り、SELECTステートメントを使用して3つの値を返すストアドプロシージャを呼び出しているときに同じエラーメッセージが表示され、EFコードファーストアプローチで以下のような問題を解決しました。

 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

私は次のようにEF6.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を2倍にしないでください。一部の人は、変数に対してこれを行うとやけどを負います。

var Action = new SqlParameter("@Action", 1);  // Don't do this, as it is set below already.
于 2019-10-03T17:37:41.800 に答える