2014-06-18 3 views
9

C#의 MySQL 데이터베이스에서 SQL 쿼리를 실행하기 전에 실행될 쿼리를 기록하려고합니다. 내가 지금 무엇을 가지고 있는지 분명히 기록하고 있습니다 SELECT * FROM foo WHERE Id = @IdSELECT * FROM foo WHERE Id = 5을보고 싶습니다. 어떻게해야합니까?DbCommand에서 매개 변수가있는 SQL 쿼리 문자열 얻기

DbCommand dbCommand = dbFactory.CreateCommand(); 
    dbCommand.CommandText = "SELECT * FROM foo WHERE Id = @Id"; 

    DbParameter param = dbCommand.CreateParameter(); 
    param.ParameterName = "@Id"; 
    param.Value = 5; 

    dbCommand.Parameters.Add(param); 

    dbConnection.Open(); 
    Log.AddVerbose(String.Format("SQL query: {0}", dbCommand.CommandText)); 
    dbCommand.ExecuteReader(); 
+1

** 실제 사용하는 구체적인 데이터베이스 시스템 **에 따라 다릅니다 ** 쿼리 언어로 ** SQL **를 사용하는 모든 관계형 데이터베이스가 정확히 같은 방식으로 작동합니다 ..... 관련 데이터베이스 시스템으로 태그를 업데이트하십시오! –

+0

해당 데이터베이스 시스템은 MySQL입니다. 업데이트 된 게시물과 추가 된 태그입니다. – BioGeek

+2

이것은 DB 시스템에 따라 다르지만 사용하고자하는 DB에 대해서는 찾고있는 문자열이 ** 존재하지 않습니다 **, 데이터베이스 서버에는 없습니다 . 이것이 매개 변수화 된 쿼리의 핵심입니다. 코드에서 데이터를 분리해야합니다. 그래서 쿼리 매개 변수가 SQL 주입 공격을 막는 데 핵심적인 역할을합니다. 악의적 인 데이터는 SQL 문자열 가까이에 존재하지 않습니다. –

답변

14

로깅하려는 경우 이와 같은 확장 방법을 사용할 수 있습니다.

public static string GetGeneratedQuery(this SqlCommand dbCommand) 
{ 
    var query = dbCommand.CommandText; 
    foreach (var parameter in dbCommand.Parameters) 
    { 
      query = query.Replace(parameter.ParameterName, parameter.Value.ToString()); 
    } 

    return query; 
} 

그리고 이렇게 사용할 수 있습니다.

Log.AddVerbose(String.Format("SQL query: {0}", GetGeneratedQuery(dbCommand))); 
+1

이것은 명명 된 매개 변수에서만 작동합니다. 간단한'? '자리 표시자를 사용하는 데이터베이스를 사용하는 경우 대신 주문과 일치하게됩니다. –

+0

동의하지만 OP는 명명 된 매개 변수를 사용하여 SqlCommand를 사용 중입니다. – Anuraj

+1

문제가 있습니다. param 값이 String 유형이면 값에 아포스트로피가 사용되지만 위의 예는 효과가 없습니다. [여기에 더 완벽한 솔루션입니다] (http://stackoverflow.com/questions/5356467/from-net-can-i-get-the-full-sql-string-generated-by-a-sqlcommand-object-with) -에스) –

관련 문제