[C#] 저장 프로 시저와 함께 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)


답변

이 솔루션은 SQL Server 2005에만 해당됩니다.

여러분은 생명의 은인이지만 @Dan Mork가 말했듯이 EXEC를 믹스에 추가해야합니다. 나를 트립하고 있던 것은 :

  • Proc 이름 앞에 ‘EXEC’
  • Params 사이의 쉼표
  • Param Definitions에서 ‘@’잘라 내기 (비트가 필요한지 확실하지 않음)

:

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


답변

대부분의 답변은 SP의 매개 변수 순서에 의존하기 때문에 취하기 어렵습니다. Stored Proc의 매개 변수 이름을 지정하고 매개 변수화 된 값을 지정하는 것이 좋습니다.

SP를 호출 할 때 매개 변수 순서에 대해 걱정할 필요없이 명명 된 매개 변수를 사용하려면

ExecuteStoreQuery 및 ExecuteStoreCommand와 함께 SQL Server 명명 된 매개 변수 사용

최선의 방법을 설명합니다. 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)


답변

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


답변

이 방법을 사용합니다.

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

Guids와 Datetimes에 빠지고 SqlQuery가 모든 형식을 수행하기 때문에 마음에 들었습니다.