DbContext.Database.SqlQuery를 사용하는 방법저장 프로 시저가있는 (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가 모든 형식을 수행하기 때문에 좋아합니다.
@Tom Halladay의 대답은 shopuld도 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)
두 개의 입력 매개 변수를 사용하고 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();
나는 다음과 같이 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.
'IT story' 카테고리의 다른 글
IEEE754 NaN 값에 대해 false를 반환하는 모든 비교의 이론적 근거는 무엇입니까? (0) | 2020.04.12 |
---|---|
Joda Time 라이브러리를 사용하여 날짜 문자열을 DateTime 객체로 변환 (0) | 2020.04.12 |
HttpClient 제공 업체가 없습니다. (0) | 2020.04.11 |
루트 URL을 하위 디렉토리로 리디렉션하기위한 .htaccess 재 작성 (0) | 2020.04.11 |
vim에서 C 코드를 자동 서식 / 인 덴트하려면 어떻게해야합니까? (0) | 2020.04.11 |