2012-02-01 3 views
1

데이터베이스의 스키마 이름은 동적입니다. 왜 다음과 같이 작동하지 않습니까?SqlCommand 매개 변수를 사용하여 선택 쿼리의 스키마 이름을 지정하는 방법

public void ReadVersion(string connString, string schemaName) 
{ 
    string selectCommand = "SELECT major FROM [@SchemaName].[version]"); 
    using (SqlConnection sqlConn = new SqlConnection(connString)) 
    { 
     using (SqlCommand cmd = new SqlCommand(selectCommand, sqlConn)) 
     { 
      sqlConn.Open(); 
      cmd.Parameters.AddWithValue("@SchemaName", schemaName); 
      object result = cmd.ExecuteScalar(); 
     } 
    } 
} 

명령을 실행하면 매개 변수 값이 대체되지 않습니다. SqlCommand 매개 변수의 제한 사항입니까?

답변

4

당신 은 일반 SQL에서 다음을 수행하지 수 있습니다 (그래서 ADO.Net 오버 헤드를 모두 무시). FROM 후에 SQL이 원하는 것은 이름은입니다. 당신이주고 자하는 것은 문자열입니다. SQL Server 문자열의 피어링을 무작위로 시작하여 다른 구문과 닮은지 확인합니다.

당신의 위생 질의에 대해, 당신이 스키마 이름을 제정신으로하고 있다고 가정 할 때 신뢰하기 전에 스키마 이름에 간단한 정규 표현식을 사용하십시오 (예 : ^[A-Z][A-Z0-9]+$은 대부분의 사용에 충분해야합니다). 블랙리스트가 아닌 허용 된 문자를 사용하십시오.

+1

Damien에게 감사드립니다 - 내 SQL에 대한 이해가 커졌습니다. 이제는 DB 사용자에게 스키마를 쿼리하여 코드를 훨씬 더 우아하게 만들 수 있습니다. 런타임) a DEFAULT_SCHEMA - 각 스키마에 대해 일치하는 고유 한 DB 사용자를 생성했기 때문에 – GarethOwen

+0

안녕하세요 -이 스레드를 necro하지 않으시겠습니까? 그렇지만 sys.schemas에 대해 @SchemaName을 검사하여 유효성을 검사 할 수 있습니까? –

3

SqlCommand 매개 변수의 제한 사항입니까?

예, 제한 사항입니다. ADO.NET에서는 스키마에 대한 매개 변수 (테이블 및 열 이름과 같은 항목)를 사용할 수 없습니다. 가장 좋은 방법은 문자열 연결을 사용하는 것입니다. 결과적으로 자신의 필터링을 필터링하는 것입니다.

DECLARE @SchemaName sysname 
SET @SchemaName = 'dbo' 
SELECT major FROM @SchemaName.[version] 

을 그리고 그 이유는 간단하다 :

+1

이것이 SqlCommandParameter의 제한이 아니라고 생각합니다. 그들은 처음부터 이러한 용도로 사용하도록 고안되지 않았습니다. –

+0

감사합니다. SQL 삽입에 대해 걱정할 필요가 없도록 매개 변수를 사용하려고했습니다. 이 공용 메소드는 다른 내부 프로젝트에서 사용할 라이브러리에 있습니다. '주입 용으로 필터링'하는 방법에 대한 조언이 필요하십니까? – GarethOwen

+2

@ GarethOwen, 스키마 이름을 통과 한 테스트를 만들 수 있습니다. 예를 들어 길이는 [,], ", '를 포함해서는 안됩니다. –

관련 문제