ODBCDBE und MSSQL
Moderator: Moderatoren
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
ODBCDBE und MSSQL
Hallo,
hat jemand größerer Projekte mit der ODBCDBE gemacht ? Ich habe anfangs damit gearbeitet und hatte große Probleme. Muss ein Projekt damit machen und kann SQLEXPRESS wegen Fehler momentan nicht verwenden.
Grüße
Rudolf
hat jemand größerer Projekte mit der ODBCDBE gemacht ? Ich habe anfangs damit gearbeitet und hatte große Probleme. Muss ein Projekt damit machen und kann SQLEXPRESS wegen Fehler momentan nicht verwenden.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
Re: ODBCDBE und MSSQL
Ich habe wegen verschiedener Probleme mit ODBCDBE einen alternativen Ansatz für meine Projekte gebaut:
die SQL-Seite wird mit C#/Dot.Net/ADO gehandelt, das ganze als OCX/Activex verpackt und über Activex/Createobject aus Xbase++ angesprochen. Funktioniert für meinen Bedarf sehr gut und man hat m.E. mehr Kontrolle über das was geschieht und man kann zwischen man hat die Zusatzebend C#+ADO um Probleme zu lösen, also nicht nur SQL und Xbase++
Falls das interessiert kann ich gerne mehr dazu sagen, evt. einfach mal telefonieren
+49 172 6738873
+49 6173 7027591
email: joerg.bertram@t-online.de
Jörg Bertram
die SQL-Seite wird mit C#/Dot.Net/ADO gehandelt, das ganze als OCX/Activex verpackt und über Activex/Createobject aus Xbase++ angesprochen. Funktioniert für meinen Bedarf sehr gut und man hat m.E. mehr Kontrolle über das was geschieht und man kann zwischen man hat die Zusatzebend C#+ADO um Probleme zu lösen, also nicht nur SQL und Xbase++
Falls das interessiert kann ich gerne mehr dazu sagen, evt. einfach mal telefonieren
+49 172 6738873
+49 6173 7027591
email: joerg.bertram@t-online.de
Jörg Bertram
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9052
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 79 Mal
- Danksagung erhalten: 267 Mal
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Ich mache nur kleinere Sachen (Datenabfragen, Datenmigrationen) über die ODBCDBE. Sie ist nicht verlässlich und äußerst langsam, und die Konfiguration ist für Endanwender meistens zu komplex, muss außerdem für jeden Arbeitsplatz erfolgen.
Herzlich,
Tom
Tom
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo Tom, Bertram,
Danke für Eure Antworten, fühle mich bestätigt dass ich die Finger von der ODBCDBE lasse, die alten Fehler dürften immer noch nicht behoben sein. Alleine ich habe mind. 3 PDR's damals gefunden, wer weiss was da noch alles lauert
Versuche weiter mit SQLEXPRESS meine Probleme zu lösen, mit workarounds komme ich der Lösung schon näher. Aber nur die letzte autoincrement ID zurückzulesen nach eine SQL statement ist schon ein Problem bei dem nicht mal Boris helfen kann. Und habe noch Probleme mit Cursor, obwohl ich sie bei anderen Projekten problemlos einsetze. Sehe also viele Fallen in die man tappen kann, aber ich glaube das liegt grundsätzlich am SQL.
Grüße
Rudolf
Danke für Eure Antworten, fühle mich bestätigt dass ich die Finger von der ODBCDBE lasse, die alten Fehler dürften immer noch nicht behoben sein. Alleine ich habe mind. 3 PDR's damals gefunden, wer weiss was da noch alles lauert

Versuche weiter mit SQLEXPRESS meine Probleme zu lösen, mit workarounds komme ich der Lösung schon näher. Aber nur die letzte autoincrement ID zurückzulesen nach eine SQL statement ist schon ein Problem bei dem nicht mal Boris helfen kann. Und habe noch Probleme mit Cursor, obwohl ich sie bei anderen Projekten problemlos einsetze. Sehe also viele Fallen in die man tappen kann, aber ich glaube das liegt grundsätzlich am SQL.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
Re: ODBCDBE und MSSQL
scope_identity()
oder meine bevorzugte variante:
insert into TabellenName(Feldname) output inserted.id_feldname_id values ('TEST')
man kann es auch wie bei xbase++ (append blank) machen: per procedur erzeugt man sich erstmal einen leeren neue Datensatz mit einer wie auch immer gearteten Nr, lässt sich diese Nr zurückgegen und macht dann auf diesen Satz ein update , also keine inserts mehr
Jörg
oder meine bevorzugte variante:
insert into TabellenName(Feldname) output inserted.id_feldname_id values ('TEST')
man kann es auch wie bei xbase++ (append blank) machen: per procedur erzeugt man sich erstmal einen leeren neue Datensatz mit einer wie auch immer gearteten Nr, lässt sich diese Nr zurückgegen und macht dann auf diesen Satz ein update , also keine inserts mehr
Jörg
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo Jörg,
ich teste mit LAST_INSERT_ID() in MySQL und SQLEXPRESS indem ich es ans INSERT Statement anhänge. Ich weiss aber nicht wie ich den Wert wieder zurückbekomme. In der MySQL Workbench habe ich sofort die neue ID über die Kommandozeile. Mit einen SQL Cursor geht es mit fieldget(1), aber ich erhalte immer eine falsche ID da die Daten anscheinend noch nicht am Server zurückgespeichert wurden. Und wenn ich ein updaterow() mache, geht gar nichts mehr, ich dachte ich kann danach gleich die neue autoincement id auslesen. Die später mit fieldput gesetzten Werte landen dann nicht in der Tabelle. Das gleiche mit commit(). Dachte das geht mit ODBCDBE, aber ist mir jetzt grundsätzlich zu unsicher.
Grüße
Rudolf
ich teste mit LAST_INSERT_ID() in MySQL und SQLEXPRESS indem ich es ans INSERT Statement anhänge. Ich weiss aber nicht wie ich den Wert wieder zurückbekomme. In der MySQL Workbench habe ich sofort die neue ID über die Kommandozeile. Mit einen SQL Cursor geht es mit fieldget(1), aber ich erhalte immer eine falsche ID da die Daten anscheinend noch nicht am Server zurückgespeichert wurden. Und wenn ich ein updaterow() mache, geht gar nichts mehr, ich dachte ich kann danach gleich die neue autoincement id auslesen. Die später mit fieldput gesetzten Werte landen dann nicht in der Tabelle. Das gleiche mit commit(). Dachte das geht mit ODBCDBE, aber ist mir jetzt grundsätzlich zu unsicher.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
- brandelh
- Foren-Moderator
- Beiträge: 15568
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 41 Mal
- Danksagung erhalten: 22 Mal
- Kontaktdaten:
Re: ODBCDBE und MSSQL
bei dbf dateien hatte ich auch nie einen autoinkrement, daher habe ich entweder aus dem Inhalt oder aus einer Zufallszahl eine eindeutige ID erstellt und diese verwendet.
Warum nicht bei SQL auch so machen ?
PS: zu MySQL hatte ich was gefunden:
http://xbaseforum.de/viewtopic.php?f=88 ... %2A#p77386
Warum nicht bei SQL auch so machen ?
PS: zu MySQL hatte ich was gefunden:

Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12799
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 18 Mal
- Danksagung erhalten: 28 Mal
Re: ODBCDBE und MSSQL
so wie ich die Antwort von Boris in der Newsgroup verstanden habe muss man die Query separat durchführen um das richtige Ergebnis zu bekommen.
Error update cursor after append
sqlexpress
17. November 2016
Boris Borzic
23. November 2016
Code: Alles auswählen
function InsertGetLastID( oInsert, aParam ) local nSuccess, nID, oConn, oCur if aParam == NIL nSuccess := oInsert:execute() else nSuccess := oInsert:execute(aParam) endif if nSuccess == SQL_XPP_ERROR Return -1 endif oConn := oInsert:connection oCur := SQLSelect():new("SELECT LAST_INSERT_ID()", oConn,; SQL_CONCUR_READ_ONLY, SQL_CURSOR_FORWARD_ONLY) oCur:execute() nID := oCur:fieldget(1) oCur:destroy() Return nID
gruss by OHR
Jimmy
Jimmy
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo Jimmy,
danke hab ich schon so gemacht, aber natürlich sehr umständlich und langsam sowas nach jedem SQL Statement auszuführen. Ich dachte es gibt eine Lösung bei der man beim Abschicken des Statements sofort die ID zurückbeommt.
Grüße
Rudolf
danke hab ich schon so gemacht, aber natürlich sehr umständlich und langsam sowas nach jedem SQL Statement auszuführen. Ich dachte es gibt eine Lösung bei der man beim Abschicken des Statements sofort die ID zurückbeommt.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
Re: ODBCDBE und MSSQL
Wenn du das nicht als xbase++ Funktion sondern als SQL-Procedur ausführst, dann hättest du nur einen SQL-call
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo Jimmy,
anscheinend kann ich Rückgabewerte nur über eine Cursor holen, sonst hätte ich auch schon an ein Script gedacht. Das Problem ist dass man keinen Rückgabewert für ein SQL Statement bekommt sondern immer nur den Status bzw. rows effected.
Grüße
Rudolf
anscheinend kann ich Rückgabewerte nur über eine Cursor holen, sonst hätte ich auch schon an ein Script gedacht. Das Problem ist dass man keinen Rückgabewert für ein SQL Statement bekommt sondern immer nur den Status bzw. rows effected.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2803
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 10 Mal
Re: ODBCDBE und MSSQL
Hallo,
bei MySQL gibt es eine Funktion, Last_Insert_ID(). Die liefert die zuletzt erstellte ID (AUTO_INCREMENT) zurück.
Ich gehe stark davon aus, dass es bei MSSQL eine vergleichbare Funktion gibt.
bei MySQL gibt es eine Funktion, Last_Insert_ID(). Die liefert die zuletzt erstellte ID (AUTO_INCREMENT) zurück.
Ich gehe stark davon aus, dass es bei MSSQL eine vergleichbare Funktion gibt.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo Georg,
die kenne ich, in SQLEXPRESS gibt es auch:
Wie Du siehst sehr umständlich und zeitaufwändig wenn man viele Sätze bearbeitet.
Grüße
Rudolf
die kenne ich, in SQLEXPRESS gibt es auch:
Aber auch Boris hat keine Lösung, nur diese hier::LastIDSyntax
exported / character
Provides the SQL SELECT syntax for retrieving the last inserted identity value from a table containing a auto-unique field.
Example:
oConn:LastIDSyntax := "SELECT SCOPE_IDENTITY()" // MS-SQL Server syntax
Code: Alles auswählen
function InsertGetLastID( oInsert, aParam )
******************************************************************
local nSuccess, nID, oConn, oCur
if aParam == NIL
nSuccess := oInsert:execute()
else
nSuccess := oInsert:execute(aParam)
endif
if nSuccess == SQL_XPP_ERROR
Return -1
endif
oConn := oInsert:connection
oCur := SQLSelect():new("SELECT LAST_INSERT_ID()", oConn,;
SQL_CONCUR_READ_ONLY, SQL_CURSOR_FORWARD_ONLY)
oCur:execute()
nID := oCur:fieldget(1)
oCur:destroy()
Return nID
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2803
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 10 Mal
Re: ODBCDBE und MSSQL
Hallo, Rudolf -
ich habe es nicht ausprobiert, denke aber, dass es so gehen könnte:
Das Ganze dann als Query ausführen (auch ein INSERT ist ein Query).
Ob ODBCDBE Dir dann das Ergebnis der zweiten Anweisung richitg zurückliefert, das kann ich nicht sagen, das müsstest Du ausprobieren.
ich habe es nicht ausprobiert, denke aber, dass es so gehen könnte:
Code: Alles auswählen
cStmt := "INSERT INTO ...; SELECT last_insert_id();"
Ob ODBCDBE Dir dann das Ergebnis der zweiten Anweisung richitg zurückliefert, das kann ich nicht sagen, das müsstest Du ausprobieren.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo Georg,
genau das habe ich schon probiert, bekomme die ID nicht zurück, nur den Fehlerstatus. Man muss in SQLEXPRESS 3 sogar :LastIDSyntax = NIL setzen, sonst kommt ein Fehler. Ich denke dass Boris hier schon experimentiert hat, aber noch keine Lösung.
Grüße
Rudolf
genau das habe ich schon probiert, bekomme die ID nicht zurück, nur den Fehlerstatus. Man muss in SQLEXPRESS 3 sogar :LastIDSyntax = NIL setzen, sonst kommt ein Fehler. Ich denke dass Boris hier schon experimentiert hat, aber noch keine Lösung.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo,
vielleicht bestätigt das meine Befürchtungen dass es nicht möglich ist:
Grüße
Rudolf
vielleicht bestätigt das meine Befürchtungen dass es nicht möglich ist:
Für mich unverständlich, SQL dürfte in vielen Bereichen ein Problem werden im Vergleich zu DBF Dateien.Fetching the last id after an insert is a terrible waste of server
resources if you do not need it. And quite often it is not needed,
therefore I will not be adding this to the library. However, you can do it
yourself very easily, example (untested code):
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2803
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 10 Mal
Re: ODBCDBE und MSSQL
Hallo, Rudolf -
ich kenne Dein Problem nicht genau, aber ich würde mir persönlich überlegen, wie ich den Datensatz so "eindeutig" machen kann, dass man ihn wieder auffinden kann.
So führe ich in fast allen Tabellen ein TIMESTAMP-Feld mit, um auf einfache und schnelle Art konkurrierende Updates zu erkennen.
Ein "SELECT now() AS TIMESTAMP;" vor dem INSERT und eines nach dem INSERT liefert mir den Zeitrahmen, in dem mein INSERT ausgeführt wurde. Wenn die Tabelle nun noch den Benutzer und die Workstation als Felder enthält, sollte es möglich sein, den gerade geschriebenen Satz zu identifizieren:
Es ist nicht zwingend elegant, es ist nicht zwingend schnell, es frisst zusätzlichen Speicherplatz durch die Felder für Benutzer, Workstation und den Timestamp, aber es sollte den gerade geschriebenen Satz so isolieren können, dass Du an den primary key rankommst.
ich kenne Dein Problem nicht genau, aber ich würde mir persönlich überlegen, wie ich den Datensatz so "eindeutig" machen kann, dass man ihn wieder auffinden kann.
So führe ich in fast allen Tabellen ein TIMESTAMP-Feld mit, um auf einfache und schnelle Art konkurrierende Updates zu erkennen.
Ein "SELECT now() AS TIMESTAMP;" vor dem INSERT und eines nach dem INSERT liefert mir den Zeitrahmen, in dem mein INSERT ausgeführt wurde. Wenn die Tabelle nun noch den Benutzer und die Workstation als Felder enthält, sollte es möglich sein, den gerade geschriebenen Satz zu identifizieren:
Code: Alles auswählen
SELECT record_id FROM table WHERE timestamp >= " + cTS1 + " AND timestamp <= " + cTS2 + " AND username = '" + cUserName + '" AND workstation = '" + cWorkstation + "'"
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: ODBCDBE und MSSQL
Hallo Gerog,
könnte es so machen, habe auch dtos(date())+ntrim(sconds()) als ID, aber denke es ist genauso langsam wie über den Cursor. Werde es aber mal teste, 1000 mal über last insert id und mit Deiner Methode, mal schauen wie groß der Unterschied ist. Habe große Unterschiede zwischen Cursor und SQL Statements gefunden die alles extrem langsam machen können.
Grüße
Rudolf
könnte es so machen, habe auch dtos(date())+ntrim(sconds()) als ID, aber denke es ist genauso langsam wie über den Cursor. Werde es aber mal teste, 1000 mal über last insert id und mit Deiner Methode, mal schauen wie groß der Unterschied ist. Habe große Unterschiede zwischen Cursor und SQL Statements gefunden die alles extrem langsam machen können.
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net