2017-10-30 10 views
0

로깅에 적용된 매개 변수로 SQL 쿼리를해야합니다.Dapper에서 실행하기 전에 매개 변수가 적용된 매개 변수가있는 SQL 쿼리를 가져 오는 방법은 무엇입니까?

private dynamic GetInfo(int cdEmpresa) 
{ 
    dynamic info = new ExpandoObject(); 

    StringBuilder sql = new StringBuilder(); 
    sql.AppendLine(" SELECT * from FROM EMPRESA E"); 
    sql.AppendLine(" WHERE cdEmpresa = @cdEmpresa "); 

    using (IDbConnection cn = GetConnection(cdEmpresa).Connection) 
    { 
     Logger.Debug("SQL: " + sql.ToString()); // Does not apply the parameters, obviously 

     cn.Open(); 
     info = cn.Query<dynamic>(sql.ToString(), new 
     { 
      cdEmpresa = cdEmpresa // i need to execute te sql to parametrize it, is there a way to parametrize it first its execution? 
     }).ToList(); 

    } 
    return infoCadastro; 
} 
+0

글쎄, 당신은 (StringBuilder'에서 단지'cdEmpresa'를 기록합니다!) – TheVillageIdiot

+1

이것은 다른 질문에서 언급 한 것과 비슷한 요구 사항입니다 .https : //stackoverflow.com/q/44194760/5779732 'SqlCommand'에 액세스하면 샘플 코드를 찾을 수 있습니다. –

답변

2

당신이 쿼리을 처리하는 동안 언제든지 존재하지 않는 요구하고있다.

쿼리를 실행하는 경우에도 매개 변수 값은 이 아니며은 SQL 명령에 직접 입력됩니다. 매개 변수가있는 쿼리의 요점은 코드가 코드이고, 데이터가 데이터이고, 두 개가 결코 교차하지 않는다는 것입니다. 이렇게하면 새로운 언어 기능, 사용자 정의 이스케이프 문자 또는 유니 코드 괴물과 관련하여 사출 공격의 가능성을 없앨 수 있습니다. 대신이의 서버 측에

:

SELECT * FROM [table] WHERE ID=1234; 

이 같은 코드를 실행하는 것처럼 그것은 더 : 당신 항상

DECLARE @ID int; 
SET @ID = LoadParameterValueFromClientQueryObject("ID"); 
SELECT * FROM [table] WHERE ID= @ID; 

이 어디 변수 처리를 변수의 값은 명령이 실행 계획으로 이미 컴파일 될 때까지 sql 언어 컴파일러/최적화 프로그램에서 제외됩니다.