найдите дубликат и запишите его в лог-файл - PullRequest
0 голосов
/ 01 декабря 2009

У меня есть созданный код, который считывает номера доступа, номера и имена из текстового файла и сохраняет их в наборе записей. После этого я создал SQL, который хранит данные набора записей в таблице SQL Server 2005.

Проблема в том, что столбец accno является первичным ключом. но у меня есть несколько дубликатов в моем текстовом файле. При добавлении набора записей в базу данных, если он обнаруживает дубликаты, они останавливаются там и не вставляют никаких строк после этого дублирующего столбца.

Теперь я хочу, если есть какой-либо дублирующийся столбец, я хочу сохранить этот столбец в файле журнала, пропустить этот столбец и вставить оставшиеся столбцы в базу данных. Я не знаю, как это сделать. Кто-нибудь может мне помочь. например, как проверить дубликат столбца, пропустить его и вставить оставшиеся.

    ' Write records to Database

    frmDNELoad.lblStatus.Caption = "Loading data into database......"
    Dim lngRecCount As Long
    lngRecCount = 0
    rcdDNE.MoveFirst

     With cmdCommand
        .ActiveConnection = objConn
        .CommandText = "insert into t_DATA_DneFrc (RTN, AccountNbr, FirstName, MiddleName, LastName, Amount) values ('" & rcdDNE("RTN") & "', '" & rcdDNE("AccountNbr") & "', '" & rcdDNE("FirstName") & "', '" & rcdDNE("MiddleName") & "', '" & rcdDNE("LastName") & "', '" & rcdDNE("Amount") & "')"
        .CommandType = adCmdText
    End With

    Set rcddnefrc = New ADODB.Recordset
    With rcddnefrc
        .ActiveConnection = objConn
        .Source = "SELECT * FROM T_DATA_DNEFRC"
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open
    End With

    Do Until rcdDNE.EOF
        lngRecCount = lngRecCount + 1
        frmDNELoad.lblStatus.Caption = "Adding record " & lngRecCount & " of " & rcdDNE.RecordCount & " to database."
        frmDNELoad.Refresh
        DoEvents
        Call CommitNew
        rcdDNE.MoveNext
    Loop
    frmDNELoad.lblStatus.Caption = "DNE Processing Complete."
    frmDNELoad.Refresh        
End Function

    Sub CommitNew()

'     Add records to DneFrc table
    With rcddnefrc
        .Requery
        .AddNew
        .Fields![RTN] = rcdDNE.Fields![RTN]
        .Fields![AccountNbr] = rcdDNE.Fields![AccountNbr]
        .Fields![FirstName] = rcdDNE.Fields![FirstName]
        .Fields![MiddleName] = rcdDNE.Fields![MiddleName]
        .Fields![LastName] = rcdDNE.Fields![LastName]
        .Fields![Amount] = rcdDNE.Fields![Amount]
        .Update
    End With

End Sub

Ответы [ 3 ]

1 голос
/ 01 декабря 2009

Я столкнулся с этой проблемой, и я сделал коллекцию, в которой я сохранил объект и ключ в ключе. Если я пытаюсь добавить дублированный ключ, я получаю сообщение об ошибке.

Это самый простой способ сделать это в vb6. в c # есть словарь.

1 голос
/ 01 декабря 2009

Больше стратегии, чем конкретный ответ, но ...

При импорте данных из внешних источников мы часто вставляем данные в промежуточные таблицы, на которых не установлены одинаковые ключи / ограничения, а затем очищаем данные перед вставкой.

То, что делается во время «санации», зависит от ваших требований (например, если у вас два одинаковых номера счета, записи совпадают или поля данных разные, если поля разные, как выбрать, какой данные для использования?). А затем вставьте / переместите его в рабочую таблицу после завершения очистки.

0 голосов
/ 01 декабря 2009

Мое предложение было бы добавить обработку ошибок к CommitNew, чтобы увидеть, приведет ли вставленная строка к нарушению первичного ключа, и если да, то выполнить другую обработку.

Пример:

Sub CommitNew()
  ''#Add records to DneFrc table 
  On Error GoTo CommitNew_Error
  With rcddnefrc
    .Requery
    .AddNew
    .Fields![RTN] = rcdDNE.Fields![RTN]
    .Fields![AccountNbr] = rcdDNE.Fields![AccountNbr]
    .Fields![FirstName] = rcdDNE.Fields![FirstName]
    .Fields![MiddleName] = rcdDNE.Fields![MiddleName]
    .Fields![LastName] = rcdDNE.Fields![LastName]
    .Fields![Amount] = rcdDNE.Fields![Amount]
    .Update
  End With
  Exit Sub   ''# If no error, exit routine.
CommitNew_Error:
  If Err.Number = -2147217873 Then
    ''# code here will only execute if the constraint violation occurs
    Call WriteDuplicateAccountToFile()
    Err.Clear()       ''# This clears the error, since you handled it
  Else
    ''# Do stuff with other errors.
    ''# If you're not sure, at least display what error its giving, like so
    MsgBox "The following error was encountered when new record was saved:" & _
      vbNewLine & CStr(Err.Number) & " - " & Err.Description & vbNewLine & _
      "New record not saved.", vbOkOnly + vbCritical, "Error"
  End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...