ODBCDBE und MSSQL

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

ODBCDBE und MSSQL

Beitragvon Rudolf » Sa, 19. Nov 2016 13:57

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon jbertram » Mo, 21. Nov 2016 22:10

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
jbertram
Rookie
Rookie
 
Beiträge: 5
Registriert: Mo, 02. Okt 2006 16:22
Wohnort: Oberursel

Re: ODBCDBE und MSSQL

Beitragvon Tom » Di, 22. Nov 2016 10:17

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
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 6657
Registriert: Do, 22. Sep 2005 22:11
Wohnort: Berlin

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » Di, 22. Nov 2016 10:51

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon jbertram » Di, 22. Nov 2016 12:44

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
jbertram
Rookie
Rookie
 
Beiträge: 5
Registriert: Mo, 02. Okt 2006 16:22
Wohnort: Oberursel

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » Mi, 23. Nov 2016 8:27

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon brandelh » Sa, 26. Nov 2016 22:27

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:
:arrow: viewtopic.php?f=88&t=6947&p=77386&hilit=%2Astru%2A#p77386
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: ODBCDBE und MSSQL

Beitragvon AUGE_OHR » Sa, 26. Nov 2016 23:39

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10071
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » So, 27. Nov 2016 9:57

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon jbertram » Mi, 30. Nov 2016 10:25

Wenn du das nicht als xbase++ Funktion sondern als SQL-Procedur ausführst, dann hättest du nur einen SQL-call
jbertram
Rookie
Rookie
 
Beiträge: 5
Registriert: Mo, 02. Okt 2006 16:22
Wohnort: Oberursel

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » Mi, 30. Nov 2016 10:32

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon georg » Mi, 30. Nov 2016 10:37

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.
Liebe Grüsse aus der Eifel,

Georg
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1751
Registriert: Fr, 08. Feb 2008 21:29

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » Mi, 30. Nov 2016 11:20

Hallo Georg,
die kenne ich, in SQLEXPRESS gibt es auch:

: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


Aber auch Boris hat keine Lösung, nur diese hier:

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


Wie Du siehst sehr umständlich und zeitaufwändig wenn man viele Sätze bearbeitet.

Grüße
Rudolf
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon georg » Mi, 30. Nov 2016 11:26

Hallo, Rudolf -


ich habe es nicht ausprobiert, denke aber, dass es so gehen könnte:

Code: Alles auswählen
cStmt := "INSERT INTO ...; SELECT last_insert_id();"


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.
Liebe Grüsse aus der Eifel,

Georg
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1751
Registriert: Fr, 08. Feb 2008 21:29

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » Mi, 30. Nov 2016 11:44

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » Mi, 30. Nov 2016 22:15

Hallo,
vielleicht bestätigt das meine Befürchtungen dass es nicht möglich ist:
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):


Für mich unverständlich, SQL dürfte in vielen Bereichen ein Problem werden im Vergleich zu DBF Dateien.

Grüße
Rudolf
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: ODBCDBE und MSSQL

Beitragvon georg » Do, 01. Dez 2016 8:24

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:

Code: Alles auswählen
SELECT record_id FROM table WHERE timestamp >= " + cTS1 + " AND timestamp <= " + cTS2 + " AND username = '" + cUserName + '" AND workstation = '" + cWorkstation + "'"


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.
Liebe Grüsse aus der Eifel,

Georg
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1751
Registriert: Fr, 08. Feb 2008 21:29

Re: ODBCDBE und MSSQL

Beitragvon Rudolf » Do, 01. Dez 2016 9:51

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1150
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich


Zurück zu Daten und Tabellen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron