SQLExpress: Der Cursortyp wurde geändert?

SQL Express von Boris Borzic

Moderator: Moderatoren

SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Mo, 16. Dez 2013 10:45

Hallo,

ich habe da eine Frage, mein SQLLOG ist voll mit Einträgen wie:

Code: Alles auswählen
Windows 7 06.02 Build 09200, SQLXpp: 3.2.15, Runtime: 1.90.355
SQLState: 01S02,  ErrorCode:0
[Microsoft][ODBC SQL Server Driver]Der Cursortyp wurde geändert

Thread ID 3
Called from SQLSTATEMENT:EXECUTE(489)
Called from SQLSELECT:EXECUTE(1671)
Called from AUFTRAGSMANAGEMENT(405)

SQLString: SELECT TOP 1 AuftragNr FROM Auftrag ORDER BY AuftragNr DESC


Was bedeutet das? Ist das ein Fehler oder ist das nur ein Hinweis? Muss/soll ich darauf reagieren?

Wenn es nur ein unwichtiger Hinweis ist, kann man das SQL-LOG so einstellen, das nur echte Fehler protokolliert werden?


Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon georg » Mo, 16. Dez 2013 11:01

Hallo, Markus -


es gibt eine grundlegende Definition, welche Arten von Cursorn eine ODBC-Verbindung bereitstellen kann. Wenn der Server einen bestimmten Cursor-Typ nicht unterstützt, wird er ein Fallback auf einen unterstützten Typ durchführen.

Diesen Fallback dokumentiert der Server durch eine entsprechende Meldung in der ODBC-Kommunikation.

Ob es eine Definition von "Schwere" bei den Fehlermeldungen gibt, die eine ODBC-Datenquelle ausgibt, kann ich Dir nicht sagen. Aber es ist so, dass abhängig von der Anforderung ein "falscher" Cursor schon ein schwerwiegendes Problem darstellen kann.
Liebe Grüsse aus der Eifel,

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

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Mo, 16. Dez 2013 18:15

Danke Georg,

das bedeutet im Klartext ich habe im Programm einen falschen Cursor gewählt?

Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon georg » Mo, 16. Dez 2013 18:28

Hallo, Markus -


ich vermute, Du hast einen Cursor-Type ausgewählt, der vom entsprechenden SQL-Server nicht unterstützt wird.
Liebe Grüsse aus der Eifel,

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

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Mo, 16. Dez 2013 18:46

ja Georg, so dürfte es sein. Ich habe praktisch kaum wo einen Cursortyp angegeben. Jetz mal Testweise bei einer einfachen Routine den Cursor SQL_CURSOR_KEYSET_DRIVEN verwendet und an dieser Stelle ist die Meldung weg. Möglicherweise werden meine meisten SQL Probleme dadurch hervorgerufen.

Einfach den default Cursor umstellen geht nicht, oder?


Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon georg » Mo, 16. Dez 2013 20:33

Hallo, Markus -


normalerweise sollte der Server dann einen Cursor bereitstellen, der funktioniert. Andernfalls würdest Du gar keine Daten erhalten.

Den Default-Cursor kannst Du m.W. nur umstellen, wenn Du den Quellcode hast.

Ansonsten, welche SQL Probleme hast Du denn noch?
Liebe Grüsse aus der Eifel,

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

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Mo, 16. Dez 2013 21:24

Ich habe jetzt das ganze Programm nochmals durchforstet und den Cursor umgestellt, aber gleich so, dass ich mit einer Zeile den Cursor für das ganze Projekt ändern kann.

Das SQLError.log sieht jetzt mal sauber aus.

Folgendes habe ich noch:
1) Transaktionen gehen nicht (im Moment nicht ganz so wichtig)

2) wie finde ich einen neu angelegten Datensatz? Der Datensatz wird praktisch von mir als leerer Datensatz angelegt. Der SQL Server vergibt die _ID (autoincrement) sowie über einen Trigger die Auftragsnummer.

Normal müsste ich den DS mit

Code: Alles auswählen
oCursCopy:= SQLSelect():new(oCur:LastIDSyntax)


wieder finden. Leider steht in oCursCopy nichts drinnen (hier der Thread dazu http://www.xbaseforum.de/viewtopic.php?f=24&t=7622#p84778)
In der Console mit "SELECT SCOPE_IDENTITY()" funktioniert es.


Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon georg » Di, 17. Dez 2013 6:53

Hallo, Markus -


hast Du "SELECT SCOPE_IDENTITY()" mal als Befehl in einem SQLDataSet() versucht? Welches Ergebnis bekommst Du?
Liebe Grüsse aus der Eifel,

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

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Di, 17. Dez 2013 7:50

georg hat geschrieben:Hallo, Markus -
hast Du "SELECT SCOPE_IDENTITY()" mal als Befehl in einem SQLDataSet() versucht? Welches Ergebnis bekommst Du?


Hallo Georg,

nein, habe nicht, ich arbeite eigentlich (fast) ausschließlich mit SQLSelect() und ein klein wenig mit SELStatement(). Die Klasse SQLDataSet() habe ich mit eigentlich noch gar nicht richtig angesehen.

Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon georg » Di, 17. Dez 2013 8:23

Hallo, Markus -


SQLSelect() und SQLDataSet() sind für das von mir genannte Beispiel austauschbar. Also, mal versucht?
Liebe Grüsse aus der Eifel,

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

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Di, 17. Dez 2013 11:09

Hallo Georg,

habe es eben versucht, genau das selbe Ergebnis:
Code: Alles auswählen
...
oCur:append()
oCur:fieldPut(... )
IF ! oCur:UpdateRow()
   tdMsg("Problem ..."  )
ELSE
   x:=oCur:LastIDSyntax             // = SELECT SCOPE_IDENTITY()
   oCursCopy:= SQLDataSet():new(oCur:LastIDSyntax)
   x2:=oCursCopy:GetSQLColumn(1)                    // returns a SQLColumn Object
   x3:=oCursCopy:RecordGet()            // returns nil
   x4:=oCursCopy:FCount()               // returns 1
   x5:=oCursCopy:fieldGet(1)            // returns nil
ENDIF



Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon georg » Di, 17. Dez 2013 11:42

Hallo, Markus -


also, ich bewege mich normalerweise durch MySQL-Datenbanken. Daher bin ich - was andere Servertypen angeht - vielleicht ein wenig "lahm".

http://technet.microsoft.com/de-de/library/ms190315.aspx

Rückgabewert ist ein numerischer Wert in der Dimension 38,0 - aus Hector's Wrapper weiss ich, dass der entsprechende Rückgabetyp bei MySQL mit normalen Xbase-Variablen nicht abgebildet werden kann, Hector verwendet daher einen Wert, der in OT4XB als Klasse implementiert ist. Möglicherweise kann SQLExpress den Rückgabewert ebenfalls nicht abbilden?

Genug der Vorrede ...

INSERT INTO Kunden ...
SELECT Max(KundenId) FROM KUNDEN

Angenommen, KundenID ist der automatisch generierte Wert, der Dich interessiert.

Wiederum: MySQL erhöht den Wert immer wieder, selbst ein DELETE FROM Kunden setzt den AUTOINCREMENT-Wert nicht zurück. Ob sich der MSQL-Server ebenfalls so verhält, kann ich nicht sagen.

Ansonsten muss der gerade eingefügte Datensatz die höchste Nummer haben.

Soviel zu Einzelplatz-Anwendungen. Wenn Du Mehrplatzanwendungen hast, kann es schon mal vorkommen, dass PARALLEL neue Zeilen in eine Tabelle reinkommen, und dann musst Du die SELECT-Abfrage so abändern, dass sie noch eindeutig bleibt, z.B.

SELECT Max(KundenID) FROM Kunden WHERE KdOperator = 'Markus'

unter der Annahme, dass Du protokollierst, wer die letzte Änderung durchgeführt hat, und Deine Benutzerkennung 'Markus' lautet.
Liebe Grüsse aus der Eifel,

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

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Di, 17. Dez 2013 12:01

Hallo Georg,

ich löse es im Moment genau so wie es Du beschrieben hast, ist halt mein Workaround. Es kann aber aktuell vorkommen das ein Benutzer mehrfach angemeldet ist. Ich müsste also zusätzlich jeder Useranmeldung mit einer eindeutigen ID (Counter) erweitern:

SELECT Max(KundenID) FROM Kunden WHERE KdOperator = 'Markus'+id

Warum das alles wenn es mit SELECT IDENTITY so einfach wäre. :)


Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon satmax » Di, 17. Dez 2013 12:06

Georg Du bist der Größte!

Dein Link enthält die Lösung: @@IDENTITY :D
SCOPE_IDENTITY und @@IDENTITY geben die letzten Identitätswerte zurück, die in einer beliebigen Tabelle in der aktuellen Sitzung generiert wurden. SCOPE_IDENTITY gibt jedoch nur im aktuellen Gültigkeitsbereich eingefügte Werte zurück, @@IDENTITY ist nicht auf einen bestimmten Gültigkeitsbereich begrenzt.


Ist ja auch klar. :) Mit einem erneuten Select wird ein neuer Cursor erstellt, somit kann SCOPE_IDENTIT keinen Wert liefern. Mit @@IDENTITY klappt es jetzt laut Debugger mal. Richtig umprogrammiert habe ich es noch nicht, das sollte jetzt aber nur noch eine Formsache sein.

Was täte ich bloß ohne xbaseforum!

Gruß
Markus
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
 
Beiträge: 775
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich

Re: SQLExpress: Der Cursortyp wurde geändert?

Beitragvon brandelh » Di, 17. Dez 2013 12:50

Eine Idendität mit num(38) ... als eine Zahl mit 38 Stellen ?

Was kann das für ein Datentyp sein ... ich habe mal bei PowerBasic in der Hilfe nachgesehen:

QUAD INTEGER (64 Bit, 8 Byte) ... -9.22x10^18 to 9.22x10^18 ( -2^63 to 2^63 -1).
Die Genauigkeit wird mit 19 Stellen angegeben, mehr geht nicht.
Dieser Datentyp wird unter C/C++ LARGE_INTEGER und in Delphi int64 genannt ...

was also kann 38 Stellen belegen und wie soll ein Compiler damit umgehen ?
(Außer hoffen, dass ein LONG / DWORD reicht und danach umwandeln ...)

Wikipedia nennt schon mal den Datentyp:

128 Int128, Octaword, Double Quadword
signed von ≈ −1,70141·1038 bis ≈ 1,70141·1038 Stellen: 39
unsigned von 0 bis ≈ 3,40282·1038 Stellen: 39
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13195
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim


Zurück zu SQLExpress

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste