복붙노트

[SQL] 어떻게 저장 프로 시저와 DbContext.Database.SqlQuery <TElement> (SQL, PARAMS)를 사용 하는가? EF 코드 첫 번째 CTP5

SQL

어떻게 저장 프로 시저와 DbContext.Database.SqlQuery (SQL, PARAMS)를 사용 하는가? EF 코드 첫 번째 CTP5

나는 세 가지 매개 변수가있는 저장 프로 시저를하고 난 결과를 반환하려면 다음을 사용하려고했습니다 :

context.Database.SqlQuery<myEntityType>("mySpName", param1, param2, param3);

처음에는 SqlParameter에이 PARAMS으로 객체를 사용하여 시도하지만이 작동하지 않았다 다음과 같은 메시지와 함께 SQLEXCEPTION 줬어요 :

제 질문은 당신이 매개 변수를 예상하는 저장 프로 시저에이 방법을 사용할 수있는 방법입니다 그래서?

감사.

해결법

  1. ==============================

    1.다음과 같은 방법으로 SqlParameter에 인스턴스를 제공해야합니다 :

    다음과 같은 방법으로 SqlParameter에 인스턴스를 제공해야합니다 :

    context.Database.SqlQuery<myEntityType>(
        "mySpName @param1, @param2, @param3",
        new SqlParameter("param1", param1),
        new SqlParameter("param2", param2),
        new SqlParameter("param3", param3)
    );
    
  2. ==============================

    2.또한, 당신은 형식 지정자로 "SQL"매개 변수를 사용할 수 있습니다 :

    또한, 당신은 형식 지정자로 "SQL"매개 변수를 사용할 수 있습니다 :

    context.Database.SqlQuery<MyEntityType>("mySpName @param1 = {0}", param1)
    
  3. ==============================

    3.이 솔루션은 SQL 서버 2005 (전용)입니다

    이 솔루션은 SQL 서버 2005 (전용)입니다

    너희들은 구조 대원하지만 @Dan Mork 말했듯이, 당신은 혼합에 EXEC를 추가해야합니다. 나를 어떻게 된 일인가되었다 :

    :

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

    4.

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

    5.그들은 SP의 매개 변수의 순서에 의존하기 때문에 대부분의 답변은 부서지기 쉬운 있습니다. 더 나은는 저장된 프로 시저의 PARAMS의 이름을 지정하고 이들에 대한 매개 변수 값을 제공합니다.

    그들은 SP의 매개 변수의 순서에 의존하기 때문에 대부분의 답변은 부서지기 쉬운 있습니다. 더 나은는 저장된 프로 시저의 PARAMS의 이름을 지정하고 이들에 대한 매개 변수 값을 제공합니다.

    당신의 SP를 호출 할 때 매개 변수의 순서에 대한 걱정없이 명명 된 PARAMS을 사용하려면

    ExecuteStoreQuery 및 ExecuteStoreCommand와 SQL 서버 명명 된 매개 변수를 사용하여

    가장 좋은 방법을 설명합니다. 여기에 댄 Mork의 대답보다.

    예 :. :

    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)
    
  6. ==============================

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

    7.나는이 방법을 사용 :

    나는이 방법을 사용 :

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

    좋아 나는 그냥 나 서식 모든 GUID를하고 사항 날짜와은 SQLQuery 수행 드롭 때문이다.

  8. ==============================

    8.@ 톰 할러데이의 대답은 PARAMS가 null 인 경우는 같은 예외를 얻을 것이다 당신은 또한 DB Null 허용을 널 (null) 값을 확인하고 전송해야한다는 언급과 올바른

    @ 톰 할러데이의 대답은 PARAMS가 null 인 경우는 같은 예외를 얻을 것이다 당신은 또한 DB Null 허용을 널 (null) 값을 확인하고 전송해야한다는 언급과 올바른

    매개 변수화 된 쿼리는 '...'공급되지 않은 매개 변수 '@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)
    
  9. ==============================

    9.내가 SELECT 문을 사용하여 두 개의 입력 매개 변수와 반환 3 개 값을 사용 저장 프로 시저를 호출하는 작업 된 것과 동일한 오류 메시지가 있었고 나는 EF 코드 먼저 접근에 아래처럼 문제를 해결

    내가 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; }
    }
    

    UPDATE : 그것은 SQL 서버 2005없는 EXEC 키워드가 문제를 만들고있다과 같습니다. 그래서 나는 내 대답을 업데이 트 행 아래에 EXEC를 추가 된 모든 SQL Server 버전에서 작동 할 수 있도록하는

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

    10.이 같은 EF 6.x에서와 광산을했다 :

    이 같은 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.
    
  11. from https://stackoverflow.com/questions/4873607/how-to-use-dbcontext-database-sqlquerytelementsql-params-with-stored-proced by cc-by-sa and MIT license