LabVIEWForum.de
ZeilenID bei "Insert" mit LabVIEW-DB-Toolkit zurückholen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO)
+---- Thema: ZeilenID bei "Insert" mit LabVIEW-DB-Toolkit zurückholen (/Thread-ZeilenID-bei-Insert-mit-LabVIEW-DB-Toolkit-zurueckholen)



ZeilenID bei "Insert" mit LabVIEW-DB-Toolkit zurückholen - s200rs - 20.11.2006 10:08

Hallo zusammen,

habe folgendes Problem bei der Arbeit mit dem Datenbank-Toolkit von LabVIEW.

Zum einen arbeite ich mit 'ner MySQL-Datenbank, zum anderen (alternativ) lokal mit SQLite.

Ziel ist es, beim Eintrag einer neuen Zeile in eine Tabelle die ZeilenID der neu angelegten Zeile zurück zu bekommen, um anschließend mit dieser ID ein Update durchzuführen und dabei die restlichen Spalten zu füllen.

Ein Kollege hat herausgefunden, daß MySQL bei einem solchen Eintrag eine Lokale Variable namens "@@identity" anlegt, so daß der SQL-String wie folgt aussehen könnte:

INSERT INTO tabname (Spalte1, Spalte2,...) VALUES (Wert1,Wert2,...); SELECT @@identity.

Getestet haben wir das für die MySQL-Datenbank über das Programm "Navicat" und dort bekomme ich die Zeilennummer zurück.

Rufe ich eine solche Anweisung über die LabVIEW-Funktionen auf, erhalte ich eine Fehlermeldung vom ODBC-Treiber (für MySQL)
"... You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '; select @@identity' at line 1. in Conn Execute.vi"

Ähnliches passiert auch bei der SQLite-Datenbank. Da erhalte ich beim Aufruf von LabVIEW aus:
"Exception occured in Microsoft OLE DB Provider for ODBC Drivers, only one SQL statement allowed. in Conn Execute.vi"

Scheinbar bin ich da sowieso auf dem Holzweg, denn wenn ich das mit einem anderen Programm, wie z.B. "SQLiteSpy" ausprobiere, erhalte ich die Fehlermeldung "unrecognized token '@'"; lösche ich ein "@", kommt keine Fehlermeldung, aber auch kein Ergebnis, weil SQLite wahrscheinlich die Variable "identity" nicht kennt.

Kann mir jemand sagen, wie ich über LabVIEW zwei durch Semikolon getrennte Anweisungen übertragen kann, ohne, daß ein Fehler entsteht und wie bei SQLite die Variable heist, mit der die ID der eingefügten Zeile zurückgeliefert wird?

Oder gibt es eine ganz andere Möglichkeit? Wichtig ist nur, daß wirklich die ZeilenID zurückgeliefert wird, die zum entsprechenden INSERT-Befehl gehört, da verschiedene Nutzer quasi zeitgleich drauf zugreifen könnten.
Schließlich soll das Update ja im passenden Datensatz durchgeführt werden.


ZeilenID bei "Insert" mit LabVIEW-DB-Toolkit zurückholen - cb - 20.11.2006 10:18

' schrieb:INSERT INTO tabname (Spalte1, Spalte2,...) VALUES (Wert1,Wert2,...); SELECT @@identity.

Getestet haben wir das für die MySQL-Datenbank über das Programm "Navicat" und dort bekomme ich die Zeilennummer zurück.

Rufe ich eine solche Anweisung über die LabVIEW-Funktionen auf, erhalte ich eine Fehlermeldung vom ODBC-Treiber (für MySQL)
"... You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '; select @@identity' at line 1. in Conn Execute.vi"

leider kann man mittels ADO immer nur ein SQL-Statement schicken, darum kommt es zu der Fehlermeldung, wenn du versuchst das SELECT @@identity an das erste Statement dranzuhängen. Das NI-DB-Toolkit kann das nicht verarbeiten, da es intern auch "nur" mit ADO arbeitet.

Du hast mehrere Möglichkeiten das zu umgehen:
1. Du programmierst deine DB Funktionalität so um, dass du sicher stellst, dass auf das INSERT immer sofort das SELECT @@identity folgt.

2. könnte es sein, dass MySQL die identity pro user anlegt? Da bin ich mir nicht sicher, aber ich könnte mir vorstellen, dass die Entwickler von MySQL genau diesen Fall vorhergesehen haben und entsprechende Vorkehrungen getroffen haben

3. Du programmierst dein Insert als Stored Procedure, die dir das Ergebnis der Einfügeoperation zurückliefert

WERBUNG: hast du dir schon mal DAS HIER angeschaut?Wink

Grüße
CB