DbContext 사용방법데이터베이스저장 프로시저가 있는 SqlQuery(sql, params)? EF 코드 First 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 Name 앞에 'EXEC'가 표시됩니다.
- 매개 변수 사이의 쉼표
- 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의 매개 변수 순서에 의존하기 때문에 취약합니다.저장된 Proc의 매개 변수 이름을 지정하고 매개 변수 값을 지정하는 것이 좋습니다.
파라미터의 순서를 신경 쓰지 않고 SP를 호출할 때 명명된 파라미터를 사용하려면
ExecuteStoreQuery 및 ExecuteStoreCommand와 함께 SQL Server 명명 매개 변수 사용
최적의 접근법에 대해 설명합니다.여기 댄 모크의 대답보다 낫지
- 문자열 연결이나 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 값을 체크하고 param이 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)
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();
}
sql 매개 변수를 이중화하지 마십시오. 일부 사람들은 변수에 대해 이 작업을 수행하다가 화상을 입습니다.
var Action = new SqlParameter("@Action", 1); // Don't do this, as it is set below already.
SELECT 문을 사용하여 2개의 입력 파라미터를 취하고 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();
언급URL : https://stackoverflow.com/questions/4873607/how-to-use-dbcontext-database-sqlquerytelementsql-params-with-stored-proced
'programing' 카테고리의 다른 글
문자열이 숫자(플로트 또는 int)를 나타내는지 확인하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
---|---|
Markdown에서 'target="_blank'로 링크를 만들 수 있습니까? (0) | 2023.04.13 |
T-SQL의 SQL Server 정규 표현식 (0) | 2023.04.13 |
Wpf: 텍스트 상자에 드래그 앤 드롭 (0) | 2023.04.13 |
EPPlus를 사용하여 셀을 병합하시겠습니까? (0) | 2023.04.13 |