2012-05-04 3 views
1
나는 다음과 같은 상황에 사용하고

: 나는 매개 변수에 공급되는 형식 문자열 후 명령에 저를 가져올 것 궁금보기 준비된 문

cmd.CommandText = "insert into city (id, code, name, uf) values ??(@ id, @ code, @ name, @ uf);" 

상황 :

insert into city (id, code, name, uf) values ??(5, 5, 'BIG COUNTRY', 'MS'); - 예 :

이 "문자열"이 이미 입력되고 문자열로 이동하면 매개 변수가 입력 된 후 ??

제 아이디어는 로그를 만드는 것입니다, 그래서 시스템 로그를 생성하기 위해 이미 채워진 매개 변수를 가져와야합니다!

+0

그렇게 할 수 있다고 생각하지 마십시오. commandtext 및 매개 변수는 SQL Server로 전송됩니다. 매개 변수를 반복 할 수 있지만 문자열을 대체 할 수 있습니다. – Patrick

답변

1

SQL Server를 사용하는 경우 SQL Server Profiler을 사용 하시겠습니까? SQL Server를 사용하고 있지 않다면 다른 RBDMS 시스템에도 비슷한 도구가 있어야합니다 ...

이 유형의 로깅을 응용 프로그램에 추가하는 것보다 노력이 덜 들고, 실제로 데이터베이스로 보내지고 로깅 코드가 우연히 오해하여 쿼리를 잘못 기록하지는 않습니다.

프로 파일링 오버 헤드를 처리 할 수없는 프로덕션 데이터베이스에 대해 설명 할 경우 프로파일 링에 대한 혐오감이있는 경우 다음과 비슷한 방법으로 로그를 조합 할 수 있습니다.

var query = cmd.CommandText; 

foreach (var p in cmd.Parameters) 
{ 
    query = query.Replace(p.ParameterName, p.Value.ToString()); 
} 
+0

Profiler는 로깅만큼 응답 시간을 늦추지 않습니다. 적어도 프로필러는 필요할 때만 설정할 수 있으므로 로깅은 항상 켜져있을 것입니다. – Mark

+0

고마워요 미셸 테스트를 거쳐 작동했습니다 고맙습니다. – user1200282

1

쿼리는 @ 매개 변수 자리 표시자를 사용하여 DB로 전송됩니다. 매개 변수가 별도로 쿼리에 전송됩니다. 즉 클라이언트는 완료된 SQL 문을 어셈블하지 않습니다.

+0

+1 - 매개 변수 컬렉션을 직접 반복하고 완료된 문자열을 수동으로 만드는 것이 가장 좋습니다. – Tejs

+0

... DB에 절대 전송되지 않는다고 가정하면 SQL 인젝션 영역에 들어갑니다. – spender

+0

수정하십시오. 개인적으로 두 개의 다른 열에 매개 변수 데이터 세트를 더한 구문을 보게됩니다. – Tejs