2014-10-15 3 views
0

로깅 데이터베이스에 많은 수의 항목을 삽입하기 위해 SqlBulkCopier를 사용합니다.SQLBulkCopy를 사용하여 데이터베이스에 쓰려고하기 전에 데이터 테이블의 데이터 유효성 확인

프로그램의 레이아웃은 : 그것은 네트워크 (다른 서버)로부터 데이터 스트림을 수신

그러므로 스트림을 파싱 Log 오브젝트를 만든다. (200 - 400) 초. 그런 다음 각 로그를 Sql DataTable 개체에 추가합니다.

다음으로 카운터를 증가시킵니다. 일단 10000 개의 로그가 있으면 sqlBulkInsert를 수행합니다.

이제 문제는 행 중 하나가 SQL 유효성 검사에 맞지 않으면 하나의 필드가 길어서 나머지 모든 로그가 느슨해 진 경우입니다.

내가 추가하는 각 로그 항목에 대해 데이터 테이블에서 유효성 검사를 호출 할 방법이 없으므로 유효하지 않은 항목을 건너 뛰고 유효한 모든 항목을 안전하게 유지할 수 있습니다.

현재 한 항목을 시간에 삽입하고 있는데 실패하면 무시하고 다음 항목을 계속 수행합니다. 그러나 이것은 분명히 SqlBulk Copy의 장점과 성능상의 이점을 상쇄합니다.

일부 코드 :

private DataTable _logTable; 

public void AddLog(Log log) 
    { 
     if (log.serverId != null || log.serverId > 1) 
     { 
      try 
      { 
       _logTable.Rows.Add(log.logId, log.messageId, log.serverId, log.time, log.direction, log.hasRouting, 
        log.selfRouting, log.deviceType, log.unitId, log.accountCode, log.clientId, log.data); 

       if (_logBufferCounter++ > BufferValue) 
       { 
        _logBufferCounter = 0; 
        using (var sbc = new SqlBulkCopy(_connectionString, SqlBulkCopyOptions.TableLock)) 
        { 
         sbc.DestinationTableName = "dbo.Logs"; 
         sbc.BulkCopyTimeout = 0; 
         sbc.WriteToServer(_logTable); 
         _logTable.Clear(); 
         sbc.Close(); 
        } 
       } 
      } 

      catch (Exception e) 
      {    
       Log.Error("Failed to write bulk insert for LOG Table", e);     
       _logTable.Clear(); 
      } 
     } 
     else 
     { 
      Log.Error("Server Id is null for LOG: " + LogToString(log)); 
     } 
    } 
+0

Log 개체를 만드는 동안 필드의 유효성을 검사하지 않는 이유는 무엇입니까? ? SqlBulkCopy에있을 때까지 정확해야합니다. – slugster

답변

1

아니, 없다.

하지만 프로그래머는 삽입 전에 유효성 검사를 수행 할 수 있습니다. 정확히 그렇게 어렵지는 않습니다. 그리고 HEAVY 데이터 테이블을 전혀 가질 필요가 없습니다. 일반 개체를 사용하고 필요한 인터페이스를 직접 구현하여 SqlBulkDCopy 인스턴스에 해머 작업을 수행하십시오.)

+0

나는 당신이하는 말을 듣고, DataTable을 "무겁다"고 자세히 설명해 주시겠습니까? 데이터 테이블을 사용하는 것은 나쁜 습관입니까? 그렇습니다. 그러나 삽입하기 전에 코드에서 유효성 검사를 구현할 수 있다는 것에 동의합니다. 그러나 유효성 검사 규칙을 한 곳에서 유지하는 팬입니다. 그러나이 응용 프로그램의 성능 요구 사항으로 인해 코드에서 단순히 유효성을 검사하는 것이 좋습니다. – Zapnologica

+0

또한 그냥 생각해 보았습니다. 데이터베이스 쿼리없이 내 코드에서 외래 키 제약 조건, 중복 PK 오류 등을 검증하려면 어떻게해야합니까? – Zapnologica

관련 문제