2010-11-18 3 views
2

C#의 MYSQL 작업 :MYSQL에서 매개 변수화 된 명령을 일괄 처리

나는 실행할 매개 변수화 된 IDbCommands 컬렉션이 있습니다. 지금 내가 뭐하는 거지, 업데이트, 삽입의 혼합물이며, 삭제 : 난 그냥 함께 각 명령의 명령 텍스트를 결합 할 수


using (IDbConnection connection = Connecter.CreateConnection()) 
{ 
    foreach(IDBCommand command in m_commands) 
    { 
    command.Connection = connection; 
    command.ExecuteNonQuery(); 
    } 
} 

명령 매개 변수를 많이 사용합니다. 성능은 꽤 끔찍하며 더 좋은 방법이 있어야한다는 것을 알고 있습니다.

MYSql 대량 업데이트를 사용할 수는 있지만 SQL 주입 공격 위험없이 매개 변수 값을 파일로 변환하는 방법은 분명하지 않습니다.

누구든지 의견이 있으십니까?

내가 MySQL을 사용 많은 경험이없는

답변

1

여러 삽입/업데이트/삭제가 같은 테이블 (들)에 적용 할 경우, MySqlDataAdapter/DataTable 조합을 사용하여 같은 문을 함께 배치하는 것이 좋습니다. MySqlDataAdapter의 UpdateBatchSize 속성을 설정하면 일괄 처리 지원을 활성화/비활성화 할 수 있습니다. 따라서 같은 테이블에 삽입/업데이트/삭제를 한 번에 DB로 보낼 ​​수 있습니다.

나는 OracleDataAdapter와 SqlDataAdapter를 통해 상당한 성능 향상을 얻었습니다. MySqlDataAdapter는 기본 일괄 처리도 구현 한 것으로 보입니다 (실제로 테스트하지는 않았습니다).

DbCommandBatch 클래스의 형태로 기본 DbDataAdapter/DataTable 클래스를 숨기는 래퍼 클래스를 만드는 것이 좋습니다. 그런 다음이 클래스는 IDbCommand 템플릿에서 필요한 DataTable 백업을 구축하고 궁극적으로 원하는 경우 명령과 같이 그룹화 할 수 있습니다.

public interface IDbBatchCommandFactory 
{ 
    IDbCommandBatch Create(IDbCommand templateCommand); 
} 

그래서 기존의 매개 변수 컬렉션을 반복하여 원하는 경우 실제로 템플릿 명령에서 필요한 DataTable의를 구축 할 수있는 방법을 만듭니다 (당신이 이미 가지고있는 코드에 따라 쉽게 만들 수 있습니다 삶). 그러면 다음과 같은 인터페이스를 구현하는 클래스를 만들 수 있습니다.

public interface IDbBatchCommand : IDisposable 
{ 
    void AddToBatch(ParameterCollection parameters); 
    void ExecuteBatch(IDbTransaction transaction); 
} 

올바른 경로에 필요한 경우 샘플 코드를 제공 할 수 있습니다. 각 명령이 서로 다른 경우 (즉, 항상 다른 테이블 등), 이는 아무 값도 제공하지 않습니다.

참고 : 완벽한 세계에서 SqlCommandSet 등과 같은 클래스는이 유닉스를 수행하지 않아도되도록 공개적으로 사용할 수 있습니다.

+0

감사합니다. DataTable을 사용하여 이동하십시오. –

0

(나는 몇 가지 있지만 충분하지 데 도움이 트랜잭션의 내부에서 모든 명령을 넣어 묶여있다), 그래서 일괄 업데이트 기능에 익숙하지 않다가 그것을 있다. 당신이하고자하는 일에 유망한 것으로 들리지만 대량 업데이트를 사용하기 전에 먼저 데이터를 파일로 저장해야하는 경우 걱정할 필요가 없습니다.

MySQL에 이와 유사한 내용이 있는지 잘 모르겠지만 SQL Server와 작동하는 ADO.NET provides a SqlBulkCopy command. 기본적으로 코드에서 제공하는 데이터 판독기에서 직접 데이터를 데이터베이스에 삽입 할 수 있으므로 파일을 만들지 않아도되므로 문자열 관련 문제를 걱정할 필요가 없습니다.

MySQL 4.1 has prepared statements. 이 명령들은 매개 변수 값을 제외하고 모두 동일합니까? 당신이 더 나은 성능을 볼 수있을 경우는 IDbCommand.Prepare 방법을 활용하려고 있는지 궁금 해요 :

 using (IDbConnection connection = Connector.CreateConnection()) 
     { 
      var command = connection.CreateCommand(); 

      command.CommandText = "<command text>"; 

      var paramA = command.CreateParameter(); 
      paramA.ParameterName = "ParameterA"; 
      paramA.DbType = DbType.Int32; 
      command.Parameters.Add(paramA); 

      var paramB = command.CreateParameter(); 
      paramB.ParameterName = "ParameterB"; 
      paramB.DbType = DbType.String; 
      command.Parameters.Add(paramB); 

      var paramC = command.CreateParameter(); 
      paramC.ParameterName = "ParameterC"; 
      paramC.DbType = DbType.Decimal; 
      command.Parameters.Add(paramC); 

      command.Prepare(); 

      foreach (ProcedureArgs args in m_procedureArgs) 
      { 
       paramA.Value = args.ParamA; 
       paramB.Value = args.ParamB; 
       paramC.Value = args.ParamC; 
       command.ExecuteNonQuery(); 
      } 
     } 
관련 문제