Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich erläutre mal mein Hauptproblem/Aufgabe um dann zu meinem Lösungsansatzproblem zu kommen.
Ich nutze LabVIEW um an verschiedenen PC's Daten in eine SQL-Datenbank zu schreiben, gleichzeitig wird eine JPG Datei auf einem Server erstellt. Diese JPG Datei muss ich der SQL-Zeile wieder zuordnen können. Das funktioniert auch astrein mittels einer eindeutigen ID mit Primary Key, allerdings nicht mit Autoinkrement da ich im Vorfeld die neue ID nicht weiss und die JPG Datei aber erstellen muss. Jetzt kommt das Problem, wenn 2 PC's gleichzeitig in die SQL Datenbank schreiben überschreibt ein PC das Bild. Muss ja auch so Passieren, beide PC's schauen in der SQL Datenbank nach der Größten Zahl und addieren 1 dazu um die neue Zeile zu erstellen.
Meine Lösungsidee wäre jetzt eine Art Dienst zu erstellen der von den PC's mit Inhalt der neuen Zeile angesprochen wird um dann den SQL Eintrag vorzunehmen. Jetzt zur Frage: mach ich das am besten mittels TCP/IP oder gibt es eine besser alternative. Versuche mich grad an TCP aber ich habe es noch nicht so wirklich raus damit. Da der Dienst ja permanent auf Werte warten muss dazu von unterschiedlichen IP Adressen.
Hallo Appa,
so ein ähnliches Problem habe ich mit einer Tabelle in der nur ein Datensatz steht, gelöst.
Der zugreift inkrementiert den Datensatz. Damit hat man eine eineindeutige Zahl die man als Index verwenden kann.
(11.09.2017 07:57 )Freddy schrieb: Hallo Appa,
so ein ähnliches Problem habe ich mit einer Tabelle in der nur ein Datensatz steht, gelöst.
Der zugreift inkrementiert den Datensatz. Damit hat man eine eineindeutige Zahl die man als Index verwenden kann.
in Deiner SQL Datenbank eine Tabelle "Indexzaehler" mit einer Spalte "Zahl" erstellen.
Datensatz Zahl lesen und Zahl +1 Datensatz überschreiben.
Die gelesene Zahl als Index für Deine Tabelle verwenden.
Das ist doch gar kein Problem. Es gibt SQL-Kommandos, mit denen du Verbindungsspezifisch den letzten erzeugten AutoIndex abfragen kannst.
Bei MySQL lautet die entsprechende Abfrage z.B.
Code:
SELECT LAST_INSERT_ID();
Bei MS-SQL funktionieren
Code:
SELECT @@IDENTITY; ## oder
SELECT SCOPE_IDENTITY();
Also keine Klimmzüge, Tabelle mit AutoIncrement-Spalte erstellen, Bilder eintragen (ohne selber den AutoIndex zu erzeugen), und einfach korrekt nach dem Eintrag die erzeugte ID abfragen.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
(11.09.2017 08:10 )Freddy schrieb: in Deiner SQL Datenbank eine Tabelle "Indexzaehler" mit einer Spalte "Zahl" erstellen.
Datensatz Zahl lesen und Zahl +1 Datensatz überschreiben.
Die gelesene Zahl als Index für Deine Tabelle verwenden.
Gruß
Freddy
Hi Freddy,
das mache ich bisher eigentlich genau so! Nur wenn beide das gleichzeitig ausführen komme ich wieder auf das gleiche Problem
(11.09.2017 08:12 )jg schrieb: Das ist doch gar kein Problem. Es gibt SQL-Kommandos, mit denen du Verbindungsspezifisch den letzten erzeugten AutoIndex abfragen kannst.
Bei MySQL lautet die entsprechende Abfrage z.B.
Code:
SELECT LAST_INSERT_ID();
Bei MS-SQL funktionieren
Code:
SELECT @@IDENTITY; ## oder
SELECT SCOPE_IDENTITY();
Also keine Klimmzüge, Tabelle mit AutoIncrement-Spalte erstellen, Bilder eintragen (ohne selber den AutoIndex zu erzeugen), und einfach korrekt nach dem Eintrag die erzeugte ID abfragen.
Gruß, Jens
Auch hier glaube ich nicht dass das fehlerfrei funktionieren wird. Wie gesagt wenn das Simultan läuft gäbe es die Möglichkeit das beide die gleiche Zahl abrufen. Also PC1 schreibt 233 PC2 schreibt 234 und PC1 Holt die jüngsten Daten um das Bild zu erstellen und bekommt 234 zurück wie PC2 dann auch...
Oder wie es jetzt ist.
PC1 lädt Max Wert/letzten Wert "232" inkrementiert um 1 und erstellt "233" mit Bild "233", PC2 hat währenddessen ebenfalls Max Wert geladen "232" um 1 inkrementiert und erstellt "233" mit Bild "233".
Ich denke nur wenn ich ein Flaschenhals im Stil von einem Übergabeprogramm oder eine Art reservierung bis Bild Erstellt hinbekomme, passiert dieser Fehler nicht mehr.
Dazu möchte ich es verhindern einen SQL Autoinkrement zu benutzen... Ich müsste verdammt viel umschreiben bzw. alles neu schreiben. Ich nutze manchmal einen negativ Inkrement um diverse Einträge später zu selektieren.
(11.09.2017 08:26 )Appa schrieb: Auch hier glaube ich nicht dass das fehlerfrei funktionieren wird. Wie gesagt wenn das Simultan läuft gäbe es die Möglichkeit das beide die gleiche Zahl abrufen. Also PC1 schreibt 233 PC2 schreibt 234 und PC1 Holt die jüngsten Daten um das Bild zu erstellen und bekommt 234 zurück wie PC2 dann auch...
Oder wie es jetzt ist.
Doch, das funktioniert! Diese Abfragen sind Instanz-Spezifisch, d.h. sie geben für die jeweilige Datenbank-Verbindung den letzten erzeugten AutoIndex zurück. PC1 wird bei dieser Abfrage also 233, PC2 wird 234 zurückbekommen. So schlau sind die Datenbank-Engines.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
(11.09.2017 08:26 )Appa schrieb: Auch hier glaube ich nicht dass das fehlerfrei funktionieren wird. Wie gesagt wenn das Simultan läuft gäbe es die Möglichkeit das beide die gleiche Zahl abrufen. Also PC1 schreibt 233 PC2 schreibt 234 und PC1 Holt die jüngsten Daten um das Bild zu erstellen und bekommt 234 zurück wie PC2 dann auch...
Oder wie es jetzt ist.
Doch, das funktioniert! Diese Abfragen sind Instanz-Spezifisch, d.h. sie geben für die jeweilige Datenbank-Verbindung den letzten erzeugten AutoIndex zurück. PC1 wird bei dieser Abfrage also 233, PC2 wird 234 zurückbekommen. So schlau sind die Datenbank-Engines.
Gruß, Jens
Hi Jens,
ahh jetzt versteh ich! Da hab ich einfach mal SQL unterschätzt. Dann mach ich mich gleich mal ans Werk, dank dir!