복붙노트

[SQL] C #하는 SqlCommand - 어떻게 해결에 열 이름에 대한 매개 변수를 사용할 수없는 이유는 무엇입니까?

SQL

C #하는 SqlCommand - 어떻게 해결에 열 이름에 대한 매개 변수를 사용할 수없는 이유는 무엇입니까?

그렇게하는 방법을 방법이 있나요? 이 작동하지 않습니다

SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE name=@name; ");
prikaz.Parameters.AddWithValue("name", name);
prikaz.Parameters.AddWithValue("slot", slot);

내가 생각할 수있는 유일한 방법은 SP와 선언을 사용하고 열에 대한 변수를 설정하는 것입니다. 비트 ackward 나에게 보인다.

해결법

  1. ==============================

    1.당신은 일반 SQL에서이 작업을 수행 할 수 없습니다 - 당신은 (그 문제에 대한 또는 테이블 이름) 구성 열 이름이 있어야합니다, 당신은 동적 SQL을 사용해야합니다 -이를 달성하기 위해 다른 방법이 없습니다.

    당신은 일반 SQL에서이 작업을 수행 할 수 없습니다 - 당신은 (그 문제에 대한 또는 테이블 이름) 구성 열 이름이 있어야합니다, 당신은 동적 SQL을 사용해야합니다 -이를 달성하기 위해 다른 방법이 없습니다.

    string sqlCommandStatement =  
       string.Format("SELECT {0} FROM dbo.Users WHERE name=@name", "slot");
    

    그리고 그 SQL 명령을 실행하는 SQL Server에서 sp_executesql에 저장된 프로 시저를 사용하여 (필요에 따라 다른 매개 변수를 지정).

    전문적으로 SQL 서버 MVP ERLAND Sommarskog에 의해 작성 저주와 동적 SQL의 축복에 대한 궁극적 인 기사를 읽고 - 동적 SQL은 장단점이 있습니다.

  2. ==============================

    2.언급 한 바와 같이 런타임시 쿼리 자체를 구축해야 할 것이다, 그래서 당신은 기본 쿼리의 파라미터를 할 수 없다. 당신은 근본적으로 주입 공격을 방지하지만, 이번의 입력을 화이트 나열해야합니다 :

    언급 한 바와 같이 런타임시 쿼리 자체를 구축해야 할 것이다, 그래서 당신은 기본 쿼리의 파라미터를 할 수 없다. 당신은 근본적으로 주입 공격을 방지하지만, 이번의 입력을 화이트 나열해야합니다 :

    // TODO: verify that "slot" is an approved/expected value
    SqlCommand command = new SqlCommand("SELECT [" + slot +
               "] FROM Users WHERE name=@name; ")
    prikaz.Parameters.AddWithValue("name", name);
    

    이 방법 @name은 여전히 ​​매개 변수화되는 등

  3. from https://stackoverflow.com/questions/3330343/c-sharp-sqlcommand-cannot-use-parameters-for-column-names-how-to-resolve by cc-by-sa and MIT license