2017-11-03 7 views
0

매개 변수가있는 쿼리 (C# OleDB 라이브러리)의 구문을 상기 시켰고 처음 우연히 발견 한 몇 가지 예가 간단했지만 구문에 대해 알아 냈습니다.쿼리에 매개 변수를 추가하는 구문

sqlCommand.CommandText = "SELECT * FROM Customer WHERE Name LIKE @Name;"; 
sqlCommand.Parameters.AddWithValue("@Name", "%" + searchString + "%"); 

매개 변수로 대체 될 내용을 식별하기위한 SQL 형식이 내가 일반적으로 사용했던 것과 다릅니다. '@'

sqlCommand.CommandText = "SELECT * FROM Customer WHERE [Name] LIKE :Name;"; 
sqlCommand.Parameters.AddWithValue(":Name", "%" + searchString + "%"); 

지금, 두 예제 내가 함께보고 있었다 나는 일반적으로 단지 액세스 및 Oracle 작업 SQL 서버의 예에서 있었다 : 나는 일반적으로 콜론과 대괄호를 사용합니다. 하지만 '@'를 사용하는 다른 액세스 예제도 보았습니다.

실제로 어떤 차이가 있습니까, 아니면 그냥 스타일일까요? 적어도 (액세스를 사용하여) 엔진이 매개 변수 이름을 무시하고 나열된 순서대로 매개 변수를 삽입한다는 점을 상기합니다. (?)

는 OLE DB.NET Framework 데이터 공급자가 물음표로 표시됩니다 위치 매개 변수 대신 명명 된 매개 변수를 사용

은 내가 MSDN에서 확인합니다.

이것은 매개 변수 이름/구문이 중요하지 않으며 무시된다는 견해를 강화합니다. 그러나 이것이 정확하다하더라도 다른 프레임 워크에 대한 견고 함을 제공하는 좋은 습관이 있습니까?

+0

OLEDB에서 매개 변수에 대한 sigil은 (예약 문자를 사용하지 않는 한) 중요하지 않으며 매개 변수를 사용하기위한 스타일을 정의합니다. 쿼리 내에 매개 변수 이름을 제공하는 것이 좋습니다.하지만 사실 모든 쿼리 매개 변수는 첫 번째로 선언 된 매개 변수에서 처리됩니다. –

답변

1

분명히 SQL을 주입하지 못하도록 쿼리를 매개 변수화하는 것이 중요합니다. 다른 데이터베이스는 매개 변수를 사용하기 위해 다른 구문을 사용합니다. 예를 들어, SQL Server는 "@"를 매개 변수의 자리 표시 자로 사용하지만 DOES는 매개 변수의 이름을 지정할 수 있습니다. 마찬가지로 다른 곳에서는 ":"을 명명 된 자리 표시 자로 사용할 수도 있습니다. 그러나 OleDB를 사용하면 하나의 "?" 자리 표시 자라고 이름이 지정되지 않았습니다. 따라서 조회 명령에 표시되는 순서대로 매개 변수를 추가해야합니다.

또한 NAMED 매개 변수를 사용할 때 인스턴스가 발견되었습니다. 동일한 매개 변수가있는 열과 매개 변수가있는 경우 데이터베이스가 열에서 자체를 해결할 수 있으므로 의도 한대로 작동하지 않을 수 있습니다. . 설명을 돕기 위해 접두사 (또는 접미어)로 매개 변수의 이름을 바꿉니다. 그러한 예가있을 수 있습니다 ..

sqlCommand.CommandText = "update MyCustomerTable set email = @email where customerID = @customerID"; 

sqlCommand.Parameters.AddWithValue("email", "[email protected]"); 
sqlCommand.Parameters.AddWithValue("customerID", someIDValue); 

참고 사항 .. 이름이 지정된 매개 변수에는 실제로 "@"또는 ":"가 포함되지 않습니다. 엔진은 그들을 다루는 방법을 알게 될 것입니다.

모두 괜찮아 보이지만 "매개 변수"가없고 열 이름으로 돌아 가면 모호성을 방지하기 위해 시도해보십시오.

sqlCommand.CommandText = "update MyCustomerTable set email = @parmEmail where customerID = @parmCustomerID"; 

sqlCommand.Parameters.AddWithValue("parmEmail", "[email protected]"); 
sqlCommand.Parameters.AddWithValue("parmCustomerID", someIDValue); 

이렇게하면 혼동이 없습니다.

이제 "?" 장소 소유자. 여러 번 적용되는 단일 매개 변수 값이있는 경우 각 인스턴스에 매개 변수를 추가해야합니다. 명명 된 매개 변수가 허용하는 경우, 당신은 ...와

sqlCommand.CommandText = 
@"update SomeTable 
    set Rate1 = Rate1 * @newRateFactor, 
     Rate2 = Rate2 * @newRateFactor"; 

    sqlCommand.Parameters.AddWithValue("newRateFactor", 1.15); 

공지 단 하나의 명명 된 매개 변수가 필요 멀리 얻을 수 있습니다 ...하지만 "?"로, 당신은 매번 추가해야

sqlCommand.CommandText = 
@"update SomeTable 
    set Rate1 = Rate1 * ?, 
     Rate2 = Rate2 * ?"; 

    sqlCommand.Parameters.AddWithValue("ratePlaceHolder1", 1.15); 
    sqlCommand.Parameters.AddWithValue("ratePlaceHolder2", 1.15); 

SQL 삽입 및 업데이트 작업을 수행하면 모든 열 이름에 대해 많은 매개 변수가있을 때 까다로울 수 있습니다. 매개 변수 NAME 값을 계속 제공 할 수 있지만 실행을 위해 쿼리 내에서 동일한 서수 위치에 있어야합니다.

0

매개 변수 이름/구문이 중요하지 않으므로 무시됩니다.

분명히 사실이 아닙니다. 사용중인 매개 변수 접두어는 중요하지만 ODBC는 많은 플랫폼을 지원해야하기 때문에 좀 더 긴장됩니다. 그것이 당신에게 물릴 것이기 때문에 당신이 단지 어떤 쓰레기라도 버릴 수는 있지만 결코 생각하지 마십시오.

실제로 OLE DB의 매개 변수에는 ?을 사용해야합니다. 매개 변수를 제공 할 때 제공 한 이름은 무시되며 순서는 중요한 것입니다.

+0

고마워요 - 당신이 의미하는 바를 명확히 할 수 있습니까? "실제로 OLE DB의 매개 변수에'? '를 사용해야합니까? 나는 어떤 '?'문법을 보았지만 사용하지는 않았다. – ainwood