Einzelnen Beitrag anzeigen

Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#1

MySQL Daten einfügen - Exception

  Alt 23. Jan 2015, 10:53
Datenbank: MySQL • Version: 5.5.27 • Zugriff über: UniDAC
Hallo,
über einen Thread lese ich alle neuen xml Dateien aus einem Verzeichnis ein und speichere diese Daten in einer MySQL Datenbank.
Anschließend lösche ich die zuvor ausgelesene xml Datei.
Beim Speichern der Daten wird eine Exception ausgelöst... diese kann ich durch einen sleep Befehl umgehen, ich denke aber das dies Netzwerk abhängig sein wird.

Delphi-Quellcode:
uses
  System.Variants, XMLDoc, XMLIntf, ActiveX;


procedure TThreadAutoimport.LoadXmlFile(Datei: String);
var
  XmlDocument: IXMLDocument;
  NodeList: IXMLNodeList;
  MyNode: IXMLNode;
  i: Integer;
  s: String;
  d: double;
  Auftragsnummer, Abgabemenge: Integer;
  FS: TFormatSettings;
begin
  CoInitialize(nil);

  FS.DecimalSeparator := '.';
  XmlDocument := XMLDoc.LoadXMLDocument(Datei);

  try
    XmlDocument.Options := [doNodeAutoIndent];
    XmlDocument.Encoding := 'UTF-8';
    XmlDocument.Active := true;

    NodeList := XmlDocument.DocumentElement.ChildNodes;

    for i := 0 to NodeList.Count - 1 do
    begin
      if NodeList.Nodes[i].NodeName = 'Orderlistthen
      begin
        if NodeList.Nodes[i].ChildValues['Ordernumber'] <> NULL then
        begin
          s := NodeList.Nodes[i].ChildValues['Ordernumber'];
          Auftragsnummer := StrToIntDef(s, -1);

          if Auftragsnummer <> -1 then
          begin
            d := 0; // default

            MyNode := NodeList.Nodes[i].ChildNodes.FindNode('Product');

            if MyNode <> nil then
            begin
              if MyNode.ChildValues['Quantity'] <> NULL then
              begin
                s := MyNode.ChildValues['Quantity'];
                d := StrToFloatDef(s, 0, FS) * 1000;
              end;
            end;

            Abgabemenge := trunc(d);
            SaveOrderData(Auftragsnummer, '', 0, 0, 0, Abgabemenge, 0);

          end;
        end;
      end;
    end;

  except
    on E: Exception do
      TextMessage := E.Message;
  end;

  CoUninitialize;
end;

function Fill(Value: string; NewLenght: Integer; Character: Char): string;
begin
  result := StringOfChar(Character, NewLenght - length(Value)) + Value;
end;

procedure TThreadAutoimport.SaveOrderData(Auftragsnummer: Int64;
  Registration: String; Position, Workshop, Produkt, Abgabemenge,
  Abgegeben: Integer);
var
  KeyValue: String;
  q: Uni.TUniQuery;
begin
  KeyValue := Fill(IntToStr(Auftragsnummer), 20, '0') +
    Fill(IntToStr(Position), 5, '0');

  q := TUniQuery.Create(nil);
  try
    q.Connection := Datenmodul.UniConnection;
    q.Transaction := Datenmodul.UniTransaction;
    q.SQL.Clear;
    q.SQL.Add('INSERT INTO orderdata');
    q.SQL.Add(
      '(order_id, ordernumber, orderposition, registration_number, workshop, productquality, order_volume, delivery_volume, date_time)');
    q.SQL.Add(
      'VALUES (:order_id, :ordernumber, :orderposition, :registration_number, :workshop, :productquality, :order_volume, :delivery_volume, :date_time)');
    q.SQL.Add('ON DUPLICATE KEY UPDATE');
    q.SQL.Add('order_id = :order_id,');
    q.SQL.Add('ordernumber = :ordernumber,');
    q.SQL.Add('orderposition = :orderposition,');
    q.SQL.Add('registration_number = :registration_number,');
    q.SQL.Add('workshop = :workshop,');
    q.SQL.Add('productquality = :productquality,');
    q.SQL.Add('order_volume = :order_volume,');
    q.SQL.Add('delivery_volume = :delivery_volume,');
    q.SQL.Add('date_time = :date_time');

    q.ParamByName('order_id').AsString := KeyValue;
    q.ParamByName('ordernumber').AsString := IntToStr(Auftragsnummer);
    q.ParamByName('orderposition').AsInteger := Position;
    q.ParamByName('registration_number').AsString := Registration;
    q.ParamByName('workshop').AsInteger := Workshop;
    q.ParamByName('productquality').AsInteger := Produkt;
    q.ParamByName('order_volume').AsFloat := Abgabemenge;
    q.ParamByName('delivery_volume').AsFloat := Abgegeben;
    q.ParamByName('date_time').AsDateTime := now;

    q.ExecSQL;
    q.Close;
  finally
    q.Free;
  end;

  sleep(100); // ???
end;
Folgende Exceptions wurden ausgegeben:
  1. EUniError - Error: ReceiveHeader: Net packets out of order: received[3], expected[1]
  2. Erste Gelegenheit für Exception bei $75FEC42D. Exception-Klasse EMySqlException mit Meldung 'Commands out of sync; You can't run this command now'.

Es geht um ~ 400 Datensätze die sich in der XML Datei befinden.
Setze ich den sleep Befehl gross genug dann läuft der Code durch, kommentiere ich den sleep aus, dann ist eine Exception zu 100% sicher.
Muss ich die Daten anders sichern ?
Was kann ich machen...

Grüße
user0815
  Mit Zitat antworten Zitat