![]() |
Datenbank: MySQL • Version: 5.5.27 • Zugriff über: UniDAC
MySQL Daten einfügen - Exception
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:
Folgende Exceptions wurden ausgegeben:
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 = 'Orderlist' then 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;
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 |
AW: MySQL Daten einfügen - Exception
Du verzichtest auf den (Haupt-)Vorteil von Paramtern, wenn Du die Abferage jedes Mal neu setzt.
Setzte die Abfrage einmal und beim Einfügen nur noch die Parameter. |
AW: MySQL Daten einfügen - Exception
Woher kommt Datenmodul.UniConnection?
Verwendest Du das außerhalb des Threads auch? Dann ist das logisch. Besser: -Beim Erstellen des Thread die Verbindung öffnen. -Die Query erstellen. -Die Parameter binden:
Delphi-Quellcode:
prmOrdernumber := q.ParamByName('ordernumber');
-Im Thread-Ablauf dann nur die gebundenen Parameterwerte setzen
Delphi-Quellcode:
und die Query ausführen.
prmOrdernumber.AsString := IntToStr(Auftragsnummer);
- beim Beenden des Threads Query und Verbindung wieder freigeben. |
AW: MySQL Daten einfügen - Exception
Das
Delphi-Quellcode:
gehört da nicht rein, da deine Query keine Datenmenge geöffnet hat.
q.Close;
|
AW: MySQL Daten einfügen - Exception
Einiges wurde ja schon angesprochen:
Delphi-Quellcode:
gehört in einen
CoInitialize
Delphi-Quellcode:
Block. Und das Fangen der Exception kannst du dir sparen, denn die fängt die Thread-Instanz schon selber und kannst du von da auslesen.
try finally
|
AW: MySQL Daten einfügen - Exception
Zitat:
bei der Transaktion benötige ich nochmal Hilfe, was ist damit gemeint ? |
AW: MySQL Daten einfügen - Exception
Transaktion bedeutet "Alles oder nichts", d.h. entweder werden sämtliche Operationen innerhalb einer Transaktion ausgeführt oder keine, so dass immer ein konsistenter Zustand herrscht, siehe auch
![]() ![]() |
AW: MySQL Daten einfügen - Exception
Hallo,
ich habe alles umgesetzt und das ganze läuft jetzt :thumb: Der hauptsächliche Fehler war das ich die Connection aus dem Datenmodul benutzt habe. Nachdem der Thread seine eigene bekommen hat waren die Probleme auch weg. Gilt das nur für Threads oder sollte man generell für jede Form eine eigene Connection verwenden ? Zur Zeit greifen alle Forms auf die Connection im Datenmodul zu, und bisher hat das keine 'sichtbaren' Probleme ergeben. |
AW: MySQL Daten einfügen - Exception
Jedes Formular nicht unbedingt. Aber jeder Thread sollte seine eigene Verbindung haben.
|
AW: MySQL Daten einfügen - Exception
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz