SQL 쿼리 동적 매개 변수가있는 Dapper

asp.net-web-api c# dapper oracle sql

문제

내 asp.net 웹 API에서 아래 코드 줄에서 "ORA-00936 : missing expression"오류가 발생했습니다. 많은 솔루션을 시도했지만이 오류를 극복하지 못했습니다. 또한 저는 어떻게 하나 이상의 매개 변수를 동적으로 바인딩 할 수 있는지 알고 싶습니다. 나는 ORM을 나의 백엔드로 사용하고 있습니다.

        string empId = json.EMPID; //'15RD005'

        var sql = @"Select id_no,SNO,REASON,APPLIEDDATE,Case
                    when LEAVE_TYPE = 0 then 'CL'
                    when LEAVE_TYPE = 1 then 'EL'
                    when LEAVE_TYPE = 2 then 'SL'
                    when LEAVE_TYPE = 3 then 'OFF'
                    when LEAVE_TYPE = 4 then 'OD-OFF'
                    when LEAVE_TYPE = 5 then 'LOP'
                    when LEAVE_TYPE = 6 then 'OPTIONAL' end LEAVE_TYPE,
                to_char(fromdate,'DD-MON-YYYY') f_date, to_char(todate,'DD-MON-YYYY') t_date,
                    Case when fromslot=0 then 'First-Half' when fromslot=1 then 'Second-Half' when fromslot=2 then 'Full-Day' end From_Slot,
                    Case when toslot=0 then 'First-Half' when toslot=1 then 'Second-Half' when toslot=2 then 'Full-Day' end To_Slot,
                applieddays APP_DAYS,
                    case when actinact=0 and cancel_idno is not null then 'Cancelled'
                    when actinact=1 and AUTH_IDNO   is null then 'Pending'
                    when actinact=0 and cancel_idno is not null then 'Rejected'
                    else 'Authorised' end leave_Status
                from Tleaves where to_char(Todate,'mm-yyyy') >= to_char(sysdate-30,'mm-yyyy') and to_char(todate,'mm-yyyy') <=to_char(sysdate,'mm-yyyy')
                 and to_char(Todate,'yyyy')=to_char(sysdate,'yyyy') and id_no like @EmpId Order by sno";



        try
        {
            using (OracleConnection db = new OracleConnection(conString))
            {
                db.Open();

                var pastLeavesReport = new PastLeavesReportDTO();
                //3.Present and last month lev status report
                List<PastLeavesReportInfoDTO> pastLeavesReportInfo = db.Query<PastLeavesReportInfoDTO>(sql, new { EmpId = empId }).ToList();

                pastLeavesReport.EMPID = "";
                pastLeavesReport.LEAVES = pastLeavesReportInfo;


                return Ok(
                 new EmpLeavesActionResponse(ActionStatusCodes.PastLeavesReportDataFound,
                               "",
                               pastLeavesReport));


            }
        }
        catch (Exception exp)
        {

            return Ok(
                 new EmpLeavesActionResponse(ActionStatusCodes.ServerException,
                               exp.Message,
                               null));

        }

수락 된 답변

마지막으로 나는 내 코드를 거의 변경하지 않고 내 문제를 해결했다. @Empid는 Empid로 변경되었습니다. 오라클 데이터베이스는 이러한 방식으로 동적 매개 변수를 지원하기 때문입니다. 그리고 두 번째 질문은 여러 동적 매개 변수를 처리하는 방법입니다. 아래 표시된 것처럼 대위 (dappers) DynamicParameters 클래스를 사용하고 있습니다.

        var parameters = new Dictionary<string, object>();
        parameters.Add("ID", empId);

        DynamicParameters dbParams = new DynamicParameters();
        dbParams.AddDynamicParams(parameters);

그리고 우리는 아래 코드 snippe에 표시된 것과 같이 이것을 dapper에서 사용할 수 있습니다. 매개 변수 쿼리는 샘플 SQL 쿼리입니다.

          dynamic result = db.Query(query, dbParams);

인기 답변

여기에 논리 문제가 있습니다. 오류 일 수 있습니다.

case 
  when actinact=0 and cancel_idno is not null then 'Cancelled'
  when actinact=1 and AUTH_IDNO   is null then 'Pending'
  when actinact=0 and cancel_idno is not null then 'Rejected'
  else 'Authorised' 
end leave_Status

actinact = 0이고 cancel_idno가 null이 아니므로 두 번 나열됩니다.

참고 : 코드를 멋지게 형식화하면 쉽게 알아볼 수 있습니다.


두 개의 매개 변수를 새 객체에 추가하기 만하면됩니다.

new { EmpId = empId }

된다

new { EmpId = empId,
      newparam = newvalue })

그런 다음 @newparam을 쿼리에 사용하십시오.

doc -> https://msdn.microsoft.com/en-us/library/bb397696.aspx



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.