EF Core 3.1에서 선택적 반환 열을 사용하여 저장 프로 시저 실행

위자드 위자드

EF Core 3.1을 사용하고 있으며 다음 저장 프로 시저 호출이 있습니다.

public async Task<string> UserSessionGet(string user, string password, string ip)
{
    IList<SessionItem> lst = null;

    try
    {
        // Processing.  
        string sqlQuery = "EXEC [dbo].[GetUserSession] @UserLogin, @UserPassword, @IP, @ErrorCode OUTPUT, @ErrorText OUTPUT";
        int errorCode = 0;
        string errorText = string.Empty;
        lst = await this.Set<SessionItem>().FromSqlRaw(sqlQuery,
            new SqlParameter("@UserLogin", user ?? (object)DBNull.Value),
            new SqlParameter("@UserPassword", password ?? (object)DBNull.Value),
            new SqlParameter("@IP", ip ?? (object)DBNull.Value),
            new SqlParameter("@ErrorCode", errorCode) { Direction = ParameterDirection.Output},
            new SqlParameter("@ErrorText", errorText) { Direction = ParameterDirection.Output }
            ).ToListAsync();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    // Info.  
    return lst.FirstOrDefault()?.Session;
}

엔티티 :

public class SessionItem
{
    [NotMapped]
    public string Session { get; set; }
}

설정 :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SessionItem>().HasNoKey();
}

이 코드를 실행하려고하면 예외가 발생합니다.

시퀀스에 요소가 없습니다.

NotMapped로그인 실패시 주석을 제거하면 예외가 발생합니다.

필수 열 'Session'이 'FromSql'연산의 결과에 없습니다.

사용자가 잘못된 비밀번호 또는 사용자 이름 만 입력 @ErrorCode하여 @ErrorText반환되지만 데이터가 전혀없는 경우

https://i.ibb.co/pf4KzHz/Failure-Login.png

성공 호출시 하나의 열만 반환되며 Session.

https://i.ibb.co/tL3CR1H/2020-09-06-07-57-12.png

내가 무엇을하여야한다?

다른 열 집합과 동일한 동작을 가진 다른 저장 프로 시저가 있습니다.

위자드 위자드

내 자신의 확장 클래스를 작성했습니다.

    public static class DataModelExtensions
    {
        public static DbCommand LoadStoredProc(
          this DbContext context, string storedProcName)
        {
            var cmd = context.Database.GetDbConnection().CreateCommand();
            cmd.CommandText = storedProcName;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            return cmd;
        }

        public static DbCommand LoadSql(this DbContext context, string sql)
        {
            var cmd = context.Database.GetDbConnection().CreateCommand();
            cmd.CommandText = sql;
            cmd.CommandType = System.Data.CommandType.Text;
            return cmd;
        }

        public static DbCommand WithSqlParam(this DbCommand cmd, string paramName, object paramValue, ParameterDirection direction = ParameterDirection.Input, int ?size = null)
        {
            if (string.IsNullOrEmpty(cmd.CommandText))
                throw new InvalidOperationException(
                  "Call LoadStoredProc before using this method");
            var param = cmd.CreateParameter();
            param.ParameterName = paramName;
            param.Value = paramValue;
            param.Direction = direction;
            if (size.HasValue)
                param.Size = size.Value;
            cmd.Parameters.Add(param);
            return cmd;
        }

        private static List<T> MapToList<T>(this DbDataReader dr, int? errorCode, string errorText)
        {
            var objList = new List<T>();
            var props = typeof(T).GetRuntimeProperties();

            var colMapping = dr.GetColumnSchema()
              .Where(x => props.Any(y => y.Name.ToLower() == x.ColumnName.ToLower()))
              .ToDictionary(key => key.ColumnName.ToLower());

            int rowNumber = 1;

            T obj = Activator.CreateInstance<T>();
            
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    obj = Activator.CreateInstance<T>();
                    foreach (var prop in props)
                    {
                        if (colMapping.ContainsKey(prop.Name.ToLower()))
                        {
                            object val;
                            var propName = prop.Name.ToLower();
                            val = dr.GetValue(colMapping[propName].ColumnOrdinal.Value);
                            prop.SetValue(obj, val == DBNull.Value ? null : val);
                        }
                    }
                    rowNumber++;
                    objList.Add(obj);
                }
            }
            else
            {
                foreach (var prop in props)
                {
                    var propName = prop.Name;
                    if (propName == "ErrorCode")
                        prop.SetValue(obj, errorCode);
                    else if (propName == "ErrorText")
                        prop.SetValue(obj, errorText);
                }
                objList.Add(obj);
            }
            return objList;
        }

        public static async Task<List<T>> Execute<T>(this DbCommand command)
        {
            using (command)
            {
                //System.Diagnostics.Debug.WriteLine(command.ToLog());
                if (command.Connection.State == System.Data.ConnectionState.Closed)
                    command.Connection.Open();
                try
                {
                    using (var reader = await command.ExecuteReaderAsync())
                    {
                        return reader.MapToList<T>((int?)command.Parameters["@ErrorCode"].Value, (string)command.Parameters["@ErrorText"].Value);
                    }
                }
                catch (Exception e)
                {
                    throw (e);
                }
                finally
                {
                    command.Connection.Close();
                }
            }
        }

        public static async Task<bool> HasRows(this DbCommand command)
        {
            using (command)
            {
                if (command.Connection.State == System.Data.ConnectionState.Closed)
                    command.Connection.Open();
                try
                {
                    using (var reader = await command.ExecuteReaderAsync())
                    {
                        return reader.HasRows;
                    }
                }
                catch (Exception e)
                {
                    throw (e);
                }
                finally
                {
                    command.Connection.Close();
                }
            }
        }

        public static async Task<bool> QueryHasRows(this DbContext context, string sql)
        {
            return await context.LoadSql(sql).HasRows();
        }

        public static string ToLog(this DbCommand command)
        {
            //-- @p5: Input Int (Size = -1; Prec = 0; Scale = 0) [194]
            StringBuilder sb = new StringBuilder();
            sb.AppendLine();
            sb.AppendLine(command.CommandText);
            foreach(DbParameter parameter in command.Parameters)
            {
                if(parameter.Value != null && !string.IsNullOrEmpty(parameter.Value.ToString()))
                {
                    sb.AppendLine($"{parameter.ParameterName}={parameter.Value}");
                    //sb.AppendLine($"-- {parameter.ParameterName}: {parameter.Direction} {parameter.DbType} (Size = {parameter.Size}; Prec = {parameter.Precision}; Scale = {parameter.Scale}) [{parameter.Value}]");
                }
            }
            return sb.ToString();
        }
    }

사용 예 :

        public async Task<string> UserSessionGet(string user, string password, string ip)
        {
            //SessionItem lst = null;
            IList<SessionItem> lst = null;
            try
            {
                int errorCode = 0;
                string errorText = string.Empty;

                List<SessionItem> result = new List<SessionItem>();
                result = await this.LoadStoredProc("UserSessionGet")
                .WithSqlParam("@UserLogin", user)
                .WithSqlParam("@UserPassword", password)
                .WithSqlParam("@IP", ip)
                .WithSqlParam("@ErrorCode", errorCode, ParameterDirection.Output)
                .WithSqlParam("@ErrorText", errorText, ParameterDirection.Output, 255)
                .Execute<SessionItem>();
                if (result.Count == 1)
                {
                    return result[0].Session;
                }
                //return result.FirstOrDefault(x => x.iscurrent.ToLower() == "да");
                return string.Empty;
            }
            catch (Exception ex)
            {
                throw ex;
            }

       }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

단일 결과 반환을 사용하여 저장 프로 시저에서 여러 SQL 문 실행

분류에서Dev

EF Core 3.0 vs 2.2에서 저장 프로 시저 실행

분류에서Dev

저장 프로 시저에서 '동적 SQL'실행을 선택하는 방법은 무엇입니까?

분류에서Dev

쿼리가 1 개의 결과 만 반환하는 경우 쿼리를 실행하고 선택한 값을 반환하는 저장 프로 시저

분류에서Dev

SQL 저장 프로시 저는 두 개의 선택을 실행하고 값을 반환합니다.

분류에서Dev

피벗을 사용하여 저장 프로 시저에서 Null 값 반환

분류에서Dev

sqlsvr_query를 사용하여 결과 집합을 반환하는 저장 프로 시저 실행

분류에서Dev

C #을 사용하여 여러 커서를 반환하는 Oracle 저장 프로 시저를 실행하는 방법

분류에서Dev

Oracle 저장 프로 시저에서 여러 열을 사용하여 선택하는 방법

분류에서Dev

Firedac을 사용하여 SQL 저장 프로 시저 실행

분류에서Dev

Firedac을 사용하여 SQL 저장 프로 시저 실행

분류에서Dev

저장 프로 시저에서 DateTime을 매개 변수로 사용하여 변환에 실패했습니다.

분류에서Dev

특정 행을 반환하는 저장 프로 시저 plsql

분류에서Dev

Entity Framework : 다른 열 및 열 데이터 형식을 반환하는 저장 프로 시저 실행

분류에서Dev

저장 프로 시저를 사용하여 여러 행을 반환하는 방법

분류에서Dev

프로 시저에서 여러 행을 반환하고 PL / SQL 문을 선택합니다.

분류에서Dev

SQLQuery를 사용하여 .NET 응용 프로그램에서 저장 프로 시저를 실행하면 잘못된 값이 반환됩니다.

분류에서Dev

저장 프로 시저에서 여러 행 결과 집합을 반환하는 mysql asp.net

분류에서Dev

저장 프로 시저에서 여러 행 결과 집합을 반환하는 mysql asp.net

분류에서Dev

BD 봄 부팅에 저장 프로 시저를 실행하는 입증 된 응답을 반환 사용자 정의 JSON에 대한 응답으로 Return

분류에서Dev

ODP.NET을 사용하여 저장 프로 시저의 Oracle 동적 SQL에서 레코드를 반환하는 방법

분류에서Dev

저장 프로 시저를 사용하여 mysql에서 값을 선택하고 삽입하는 방법

분류에서Dev

목록에서 함수를 무작위로 선택하고 실행합니다. 프로세스를 반복하고 출력을 저장하십시오.

분류에서Dev

cakephp 3에서 저장 프로 시저를 실행하는 방법?

분류에서Dev

PHP에서 sqlsrv를 사용하여 저장 프로 시저 실행

분류에서Dev

C # asp.net의 SQL Server 저장 프로 시저에서 여러 행을 반환합니까?

분류에서Dev

EF Core에서만 Scaffold-DbContext 저장 프로 시저

분류에서Dev

EF Core 3.1에서 간단한 저장 프로 시저 호출

분류에서Dev

외부 선택을 내부 선택과 동일한 횟수로 반환하는 저장 프로 시저

Related 관련 기사

  1. 1

    단일 결과 반환을 사용하여 저장 프로 시저에서 여러 SQL 문 실행

  2. 2

    EF Core 3.0 vs 2.2에서 저장 프로 시저 실행

  3. 3

    저장 프로 시저에서 '동적 SQL'실행을 선택하는 방법은 무엇입니까?

  4. 4

    쿼리가 1 개의 결과 만 반환하는 경우 쿼리를 실행하고 선택한 값을 반환하는 저장 프로 시저

  5. 5

    SQL 저장 프로시 저는 두 개의 선택을 실행하고 값을 반환합니다.

  6. 6

    피벗을 사용하여 저장 프로 시저에서 Null 값 반환

  7. 7

    sqlsvr_query를 사용하여 결과 집합을 반환하는 저장 프로 시저 실행

  8. 8

    C #을 사용하여 여러 커서를 반환하는 Oracle 저장 프로 시저를 실행하는 방법

  9. 9

    Oracle 저장 프로 시저에서 여러 열을 사용하여 선택하는 방법

  10. 10

    Firedac을 사용하여 SQL 저장 프로 시저 실행

  11. 11

    Firedac을 사용하여 SQL 저장 프로 시저 실행

  12. 12

    저장 프로 시저에서 DateTime을 매개 변수로 사용하여 변환에 실패했습니다.

  13. 13

    특정 행을 반환하는 저장 프로 시저 plsql

  14. 14

    Entity Framework : 다른 열 및 열 데이터 형식을 반환하는 저장 프로 시저 실행

  15. 15

    저장 프로 시저를 사용하여 여러 행을 반환하는 방법

  16. 16

    프로 시저에서 여러 행을 반환하고 PL / SQL 문을 선택합니다.

  17. 17

    SQLQuery를 사용하여 .NET 응용 프로그램에서 저장 프로 시저를 실행하면 잘못된 값이 반환됩니다.

  18. 18

    저장 프로 시저에서 여러 행 결과 집합을 반환하는 mysql asp.net

  19. 19

    저장 프로 시저에서 여러 행 결과 집합을 반환하는 mysql asp.net

  20. 20

    BD 봄 부팅에 저장 프로 시저를 실행하는 입증 된 응답을 반환 사용자 정의 JSON에 대한 응답으로 Return

  21. 21

    ODP.NET을 사용하여 저장 프로 시저의 Oracle 동적 SQL에서 레코드를 반환하는 방법

  22. 22

    저장 프로 시저를 사용하여 mysql에서 값을 선택하고 삽입하는 방법

  23. 23

    목록에서 함수를 무작위로 선택하고 실행합니다. 프로세스를 반복하고 출력을 저장하십시오.

  24. 24

    cakephp 3에서 저장 프로 시저를 실행하는 방법?

  25. 25

    PHP에서 sqlsrv를 사용하여 저장 프로 시저 실행

  26. 26

    C # asp.net의 SQL Server 저장 프로 시저에서 여러 행을 반환합니까?

  27. 27

    EF Core에서만 Scaffold-DbContext 저장 프로 시저

  28. 28

    EF Core 3.1에서 간단한 저장 프로 시저 호출

  29. 29

    외부 선택을 내부 선택과 동일한 횟수로 반환하는 저장 프로 시저

뜨겁다태그

보관