SQLBulkCopy를 사용하여 데이터베이스에 쓰기를 시도하기 전에 데이터 테이블의 데이터 유효성 검사

c# datatable sql sqlbulkcopy

문제

SqlBulkCopier를 사용하여 많은 양의 항목을 로깅 데이터베이스에 삽입합니다.

프로그램의 레이아웃은 다음과 같습니다.

네트워크 (다른 서버)에서 데이터 스트림을 수신 한 다음 스트림을 구문 분석하고 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));
        }
    }

인기 답변

아니 없어.

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.