Einzelnen Beitrag anzeigen

nachtstreuner

Registriert seit: 21. Aug 2005
Ort: ESA
104 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Beim Einlesen doppelte Datensätze (PK) verhindern

  Alt 2. Sep 2010, 18:58
Viele Dank erstmal für die Antworten,

mit dem MERGE muss ich mich erstmal beschäftigen.

Die Tips von shmia habe ich beherzigt und auch so im unten stehenden Code eingefügt :

Allerdings schreibt er mir jetzt keinen einzigen Datensatz in die DB,
Stattdessen erhalte ich folgende Meldung aus dem Protokoll :

02.09.2010 18:59:08 Es werden [15668] Zeilen verarbeitet !
02.09.2010 18:59:18 Doppelter Datensatz(EAN) : 1215126156152 | Ungültige Autorisierungsangabe
02.09.2010 18:59:24 Doppelter Datensatz(EAN) : 1233567891012 | Ungültige Autorisierungsangabe
02.09.2010 18:59:29 Doppelter Datensatz(EAN) : 1234567890128 | Ungültige Autorisierungsangabe
02.09.2010 18:59:36 Doppelter Datensatz(EAN) : 1472583691477 | Ungültige Autorisierungsangabe

und das obwohl ich vor dem Start die Tabelle geleert habe.

Hier nochmal der geänderte Code :
Code:
//==============================================================================
// Verbindung zur Datenbank herstellen
//==============================================================================
procedure TForm1.ConnectToDatabase;
begin
  if not AdoConnectionMetro.Connected then
  begin
    AdoConnectionMetro.ConnectionString := ProvString;
    //'Provider=SQLOLEDB.1;Password=*******;Persist Security Info=True;'+
    // 'User ID=sa;Initial Catalog=METRO;Data Source=METROSQL\SQLEXPRESS';
    try
      AdoConnectionMetro.Connected := true;
     // ADOQueryMETRO.Active := true;
    except
      on E : Exception do begin
            MELDUNG := 'VERBINDUNGSFEHLER : '+ E.Message;
            writelog;
            FEHLER := 1;
            application.Terminate;
            form1.Close;
            ABORT;
            EXIT;
      end;
    end;
  end;
end;
//==============================================================================
// Verarbeitung starten
//==============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  liste    : TStringDynArray;
  sTEXT,DATNAME    : string;
  test : variant;
begin
  try
    memo1.Clear;
    memo1.Lines.LoadFromFile(FILEPFAD +'\'+ FileDat);
    MELDUNG := FilePFAD + '\' + FileDat + ' ... eingelesen';
    WRITELOG;
  except
    MELDUNG := '[FEHLER:] Konnte CSV Datei nicht öffnen ...';
    WRITELOG;
    Application.Terminate;

  end;

  I := 0;
  MELDUNG := 'Es werden ['+IntToStr(memo1.Lines.Count)+'] Zeilen verarbeitet !';
  Writelog;
  ADOQueryMetro.SQL.Clear;
  ADOQueryMetro.SQL.Text := 'INSERT into PRODUKTE (EAN_NR, ART_BEZ_ALTERN, '+
            'PWHG, PWG, PWUG, KZ_WERB) '+ //, WERB_ID, WERB_ZEITR_VON, WERB_ZEITR_BIS, '+
            //'BAS_GROESSE, UWD_MASSENEINHEIT_SL, VK_PREIS_BR, VK_PREIS_ALT_BR, '+
            //'VK_PREIS_WERB_BR, GRUNDPREIS_BR, GRUNDPREIS_ALT_BR, GRUNDPREIS_WERB_BR, '+
            //'AKTIONSBEGINN, AKTIONSENDE) ' +
            'VALUES (:sEAN_NR, :sART_BEZ_ALTERN, :sPWHG, :sPWG, :sPWUG, :sKZ_WERB)';



  while memo1.Lines.Count <> i do begin
   sTEXT := memo1.Lines[i];
   Liste := EXPLODE(';',sTEXT);

   // Daten Speichern
   IF (sTEXT <> '') and (LISTE[0] <> 'EAN_NR') then
     begin
      // SATZ_SPEICHERN; //
       ADOQueryMETRO.Parameters.ParamByName('sEAN_NR').Value := LISTE[0];
       ADOQueryMETRO.Parameters.ParamByName('sART_BEZ_ALTERN').Value := LISTE[5];
       ADOQueryMETRO.Parameters.ParamByName('sPWHG').Value   := LISTE[7];
       ADOQueryMETRO.Parameters.ParamByName('sPWG').Value    := LISTE[8];
       ADOQueryMETRO.Parameters.ParamByName('sPWUG').Value   := LISTE[9];
       ADOQueryMETRO.Parameters.ParamByName('sKZ_WERB').Value := LISTE[10];
       //------------------------
       try
         ADOQueryMETRO.ExecSQL;
       except
           on E : Exception do begin
            MELDUNG := 'Doppelter Datensatz(EAN) : ' + LISTE[0] +' | ' +E.Message;
           Showmessage(MELDUNG);

            writelog;

           end;
       end
   end;
   i := i +1;
   //   memo1.Lines.Delete(0);
  end;

  MELDUNG := 'Es wurden ['+ IntToStr(i) + '] Zeilen verarbeitet...';
  WRITELOG;
  DATNAME := leftstr(dateToStr(date),2)+midstr(dateToStr(date),4,2)+
   leftstr(TimeToStr(time),2)+midstr(timeToStr(time),4,2)+
   midstr(timeToStr(time),7,2)+'.CSV';
  //   movefile(PChar(FILEPFAD+ '\' + FileDat),PChar(sichPFAD+'\'+DATNAME));
   MELDUNG := FILEPFAD + '\' + FileDat+' nach '+ sichPfad + '\'+DATNAME+' verschoben !!';
   //frmLOGBUCH.memo.Lines.Add('c:\wa_order.txt nach c:\sich_order\'+DATNAME+' verschoben !!');
   writelog;
  MELDUNG := 'VERARBEITUNG abgeschlossen !! - Keine FEHLER !';
  WRITELOG;
//Form1.close;
end;
Alles wird gut -
  Mit Zitat antworten Zitat