2010-05-07 4 views
14

내가하려고하는 것은 매개 변수가있는 임의의 SQL 명령을 작성하고 매개 변수의 값과 유형을 설정 한 다음 매개 변수가 포함 된 구문 분석 된 sql 명령을 리턴하는 것입니다. SQL 데이터베이스에 대해이 명령을 직접 실행하지 않으므로 연결이 필요하지 않습니다. 내가 예제 프로그램 아래 실행한다면, 나는 다음과 같은 텍스트 (또는 비슷한) 볼 수 있도록 노력하겠습니다 것 :SqlParameters를 사용하여 SqlCommand의 구문 분석 된 텍스트를 가져올 수 있습니까?

WITH SomeTable (SomeColumn) 
AS 
(
    SELECT N':)' 
    UNION ALL 
    SELECT N'>:o' 
    UNION ALL 
    SELECT N'^_^' 
) 
SELECT SomeColumn FROM SomeTable 

그리고 샘플 프로그램은 다음과 같습니다

using System; 
using System.Data; 
using System.Data.SqlClient; 

namespace DryEraseConsole 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      const string COMMAND_TEXT = @" 
WITH SomeTable (SomeColumn) 
AS 
(
    SELECT N':)' 
    UNION ALL 
    SELECT N'>:o' 
    UNION ALL 
    SELECT @Value 
) 
SELECT SomeColumn FROM SomeTable 
"; 
      SqlCommand cmd = new SqlCommand(COMMAND_TEXT); 
      cmd.CommandText = COMMAND_TEXT; 
      cmd.Parameters.Add(new SqlParameter 
      { 
       ParameterName = "@Value", 
       Size = 128, 
       SqlDbType = SqlDbType.NVarChar, 
       Value = "^_^" 
      }); 
      Console.WriteLine(cmd.CommandText); 
      Console.ReadKey(); 
     } 
    } 
} 

사용 달성이 뭔가 닷넷 표준 라이브러리? 처음으로 검색하는 것은 '아니요'라고 말하지만 잘못된 것입니다.

답변

20

매개 변수화 된 쿼리가 작동하는 방식을 잘못 이해했습니다. 귀하가 말하는 "구문 분석 된 텍스트"는 이 아니며이 생성되었으며 매개 변수 값은 이 아니며은 직접 쿼리 문자열로 대체되었습니다.

매개 변수화 된 쿼리를 사용하는 것이 중요합니다. — 쿼리 데이터와 쿼리 데이터를 분리해야합니다. 데이터는 데이터이고, 코드는 코드이며, 결코 트웨인이 만나지 않을 것입니다. 따라서 SQL 주입 가능성은 없습니다. 궁극적으로는 다음과 같다 쿼리를 실행하는 대신

SELECT SomeColumn FROM SomeTable WHERE ID= @ID 

:

SELECT SomeColumn FROM SomeTable WHERE ID= 123 

당신이 실제로 더 이런 식으로 뭔가를 실행

이것이 의미하는 바는이 같은 CommandText에있는 경우이다 :

DECLARE @ID Int 
Set @ID = RetrieveQueryDataItem("@ID") 
SELECT SomeColumn FROM SomeTable WHERE ID= @ID 

이제 정확히 어떻게되는지는 알 수 없습니다. 엔진은 그런 코드를 변환하지 않습니다. 대신 sp_executesql 프로 시저를 사용합니다. 그러나 이것은 당신이 무슨 일이 일어나는지 이해하는 데 도움이 될 것입니다.

+2

감사합니다. 이것은 정확히 내가 듣고 싶었던 것입니다. sp_executesql이 배후에서 호출되는 것을 알고 있으면 모든 것을 설명합니다. – Burg

1

LINQ을 사용하면 C# 코드에서 원하는 컨트롤을 얻을 수 있으므로 유혹 될 것입니다. 당신이 원하는대로

+1

불행히도 Linq-To-SQL은 대부분 ORM이며, 내가하는 일이 아닙니다. 내가해야 할 일은 고급 T-SQL 생성 (예 : 대량 삽입)입니다. – Burg

3

조엘 Coehoorn는 그냥 당신은, 그러나, 당신의 가치가 있는지 확인하기 위해 귀하의 매개 변수를 볼 수 있습니다

등의 문자열 대체 또는 추가 문자를 탈출 간단한 아니다, 맞다 그들 :

foreach (IDataParameter i in cmd.Parameters) 
{ 
    Console.WriteLine(i.Value.ToString()); 
} 
2

SQLCommand 개체는 명령 텍스트의 값에 대한 매개 변수를 바꿔서 실행하지 않습니다. sp_execute sql을 지정한 텍스트로 호출 한 다음 매개 변수 목록을 제공합니다. 데이터베이스에 대해 SQL 프로파일 러를 사용하면 내 뜻을 알 수 있습니다.

실제로 여기에서 습득하려는 것은 무엇입니까?

+0

일부 SQL 명령 텍스트를 생성하는 쉬운 방법을 찾으려고했습니다.이 명령은 현장에서가 아니라 업스트림으로 실행됩니다. 쿼리의 기능은 Linq-To-SQL이 처리하기에 너무 복잡 할 수 있습니다 (LINQ가 대량 삽입, T-SQL 등을 수행한다고 생각하지 마십시오). 나는 또한 StringBuilder 접근법을 피할 수 있기를 바랬다. – Burg