2010-03-09 2 views
9

매개 변수 이름은 문은 다음과 같은 것입니다 :OleDbParameters와 나는은 OleDb를 통해 실행하고있어 SQL 문을

INSERT INTO mytable (name, dept) VALUES (@name, @dept); 

나는이 같은에서 OleDbCommand에 매개 변수를 추가 해요 :

OleDbCommand Command = new OleDbCommand(); 
Command.Connection = Connection; 

OleDbParameter Parameter1 = new OleDbParameter(); 
Parameter1.OleDbType = OleDbType.VarChar; 
Parameter1.ParamterName = "@name"; 
Parameter1.Value = "Bob"; 

OleDbParameter Parameter2 = new OleDbParameter(); 
Parameter2.OleDbType = OleDbType.VarChar; 
Parameter2.ParamterName = "@dept"; 
Parameter2.Value = "ADept"; 

Command.Parameters.Add(Parameter1); 
Command.Parameters.Add(Parameter2); 

내가 가진 문제는 다른 방향으로 명령을 내리는 매개 변수를 추가하면 열이 잘못된 값으로 채워진다는 것입니다 (예 : 이름이 부서 열에 있고 그 반대의 경우도 마찬가지 임)

Command.Parameters.Add(Parameter2); 
Command.Parameters.Add(Parameter1); 

내 질문에 매개 변수 값이 명령에 추가 된 순서대로 테이블에 삽입되는 경우 매개 변수 이름의 요점은 무엇입니까? 매개 변수 이름이 중복 된 것 같습니다.

는 어떤 도움, 감사합니다, 가레스

답변

4

매개 변수 이름은 (즉,은 OleDb 특정되지 않음) SQL 지원 시스템에서 제네릭을 apprreciated. 꽤 많이 OleDb/Odbc 만 사용하지 마십시오. OleDb은 일반 기본 클래스의 특정 구현이기 때문에 여기에 있습니다.

+0

잘 오, 올바른의 값을 추가하는 코드를 수정해야 할 것입니다 :

은 다음과 같이 코드를 사용하여 주문, 감사합니다 – Gaz

+0

그것은 크게 괴롭히는 괴물입니다. 진지하게. 그리고 만약 당신이 ODBC를 사용해 본다면, 당신은 "에 대한 것"이라고 생각합니다. (오래 전);) – TomTom

+0

'DbParameter'에는 ParameterName 필드가 없기 때문에 이상합니다.'OleDbParameter'가 ParameterName을 사용하지 않으면 클래스에 추가하지 않을 것이라고 생각할 것입니다 .. –

11

문제는 OleDb (및 Odbc도)는 명명 된 매개 변수를 지원하지 않는다는 것입니다.
위치 매개 변수 만 지원합니다.

다른 말로하면 : 명령 매개 변수 목록에 추가 할 때 매개 변수를 지정하는 이름은 중요하지 않습니다. OleDbCommand 클래스에서만 내부적으로 사용되므로 매개 변수를 구별하고 참조 할 수 있습니다.

중요한 것은 매개 변수를 목록에 추가하는 순서입니다. 물음표 문자 (?)를 통해 SQL 문에서 참조되는 매개 변수와 동일한 순서 여야합니다.

그러나 여기에 SQL 문에서 명명 된 매개 변수를 사용할 수있는 솔루션이 있습니다.
기본적으로 SQL 문의 모든 매개 변수 참조를 물음표로 바꾸고 그에 따라 매개 변수 목록을 재정리합니다. OdbcCommand 클래스에 대해 동일한 방식으로 작동합니다. 코드에서 "OleDb"를 "Odbc"로 바꾸면됩니다.

command.CommandText = "SELECT * FROM Contact WHERE FirstName = @FirstName"; 
command.Parameters.AddWithValue("@FirstName", "Mike"); 
command.ConvertNamedParametersToPositionalParameters(); 

을 그리고 여기에 약간 짜증나 코드

public static class OleDbCommandExtensions 
{ 
    public static void ConvertNamedParametersToPositionalParameters(this OleDbCommand command) 
    { 
     //1. Find all occurrences of parameter references in the SQL statement (such as @MyParameter). 
     //2. Find the corresponding parameter in the commands parameters list. 
     //3. Add the found parameter to the newParameters list and replace the parameter reference in the SQL with a question mark (?). 
     //4. Replace the commands parameters list with the newParameters list. 

     var newParameters = new List<OleDbParameter>(); 

     command.CommandText = Regex.Replace(command.CommandText, "(@\\w*)", match => 
     { 
      var parameter = command.Parameters.OfType<OleDbParameter>().FirstOrDefault(a => a.ParameterName == match.Groups[1].Value); 
      if (parameter != null) 
      { 
       var parameterIndex = newParameters.Count; 

       var newParameter = command.CreateParameter(); 
       newParameter.OleDbType = parameter.OleDbType; 
       newParameter.ParameterName = "@parameter" + parameterIndex.ToString(); 
       newParameter.Value = parameter.Value; 

       newParameters.Add(newParameter); 
      } 

      return "?"; 
     }); 

     command.Parameters.Clear(); 
     command.Parameters.AddRange(newParameters.ToArray()); 
    } 
} 
관련 문제