![]() |
Datenbank: MSSQL • Version: 2005 • Zugriff über: DBX
seltsamer MSSQL 2005 Fehler
Hallo,
ich bekomme mitten in meiner while Schleife plötzlich diesen Fehler: Zitat:
MfG Kevin |
AW: seltsamer MSSQL 2005 Fehler
5 Abfragen in einer while Schleife? Womöglich mit Abermillionen Datensätzen je Ergebnismenge? Da wäre ich aber auch busy^^. Wie sieht die Schleife denn aus?
|
AW: seltsamer MSSQL 2005 Fehler
Hier ist die Schleife mit den function's die in ihr benutzt werden.
Delphi-Quellcode:
while not VPers.Eof do
begin with VPers do begin log('Pers: %-30s %-30s', [FieldByName('Vorname').AsString, FieldByName('Nachname').AsString]); VAbt.Close; VAbt.CommandText := 'SELECT * FROM (Per p INNER JOIN ZOrgPer zop ON p.pkPerID = zop.fkPerID) INNER JOIN Abt a ON zop.fkAbtID = a.pkAbtID WHERE p.pkPerID = '+QuotedStr(VPers.FieldByName('pkPerID').AsString); VAbt.Open; VMain.Insert; inc(PersNr); VMain.FieldByName('PE_ID').Value := genid('PE_STAMM'); VMain.FieldByName('PE_NR').Value := Format('%.4d', [PersNr]); VMain.FieldByName('PE_AB_INDEX').Value := scalarQueryInt(Form3.DBXFirebird, 'SELECT AB_ID FROM AB_STAMM WHERE AB_ID = '+IntToStr(getAbtID(VAbt.FieldByName('AbtBzng').AsString))); VMain.FieldByName('PE_AB_NR').Value := scalarQueryString(Form3.DBXFirebird, 'SELECT AB_NR FROM AB_STAMM WHERE AB_ID = '+IntToStr(getAbtID(VAbt.FieldByName('AbtBzng').AsString))); VMain.FieldByName('PE_AB_NAME').Value := scalarQueryString(Form3.DBXFirebird, 'SELECT AB_NAME_LANG FROM AB_STAMM WHERE AB_ID = '+IntToStr(getAbtID(VAbt.FieldByName('AbtBzng').AsString))); if not StringIsEmpty(VPers.FieldByName('Nachname').AsString) then VMain.FieldByName('PE_NACHNAME').Value := GetString(VPers.FieldByName('Nachname').Value, 30); if not StringIsEmpty(VPers.FieldByName('Vorname').AsString) then VMain.FieldByName('PE_VORNAME').Value := GetString(VPers.FieldByName('Vorname').Value, 30); VMain.FieldByName('PE_EI_TAUGLICH').Value := 1; VMain.FieldByName('PE_AS_TAUGLICH').Value := 1; VMain.FieldByName('PE_UB_TAUGLICH').Value := 1; VMain.FieldByName('PE_EH_TAUGLICH').Value := 1; VMain.FieldByName('PE_MASKENBRILLE_MML').Value := 0; VMain.FieldByName('PE_FAHRBRILLE_MML').Value := 0; VMain.Post; VMain.ApplyUpdates(0); Next; end; end; function scalarQueryString(dbc: TSQLConnection; sql: String;): String; var VQuery: TSQLDataSet; begin VQuery := TSQLDataSet.Create(nil); VQuery.SQLConnection := dbc; VQUery.CommandText := sql; VQuery.Open; VQuery.First; result := VQuery.Fields[0].AsString FreeAndNil(VQuery); end; function scalarQueryString(dbc: TSQLConnection; sql: String;): Integer; var VQuery: TSQLDataSet; begin VQuery := TSQLDataSet.Create(nil); VQuery.SQLConnection := dbc; VQUery.CommandText := sql; VQuery.Open; VQuery.First; result := VQuery.Fields[0].AsInteger FreeAndNil(VQuery); end; function genid(tablename: String): Integer; begin result := scalarQueryInt(Form3.DBXFirebird, Format('SELECT max(%s_ID) FROM %s', [Copy(tablename, 1, 2), tablename]), true, 0); Inc(result); end; Der Fehler kommt dann nach 14 durchläufen in der Zeile
Delphi-Quellcode:
.
VAbt.Open;
|
AW: seltsamer MSSQL 2005 Fehler
Wie so oft die Frage:
Welche Curserlocation wird verwendet? Für MS SQL-Server sollte man clUseClient verwenden. |
AW: seltsamer MSSQL 2005 Fehler
Und in welche Tabelle schreibt VMain?
|
AW: seltsamer MSSQL 2005 Fehler
VMain schreibt in PE_STAMM. Und ich hab keine Curserlocation festgelegt, also wird warscheinlich der Standartwert verwendet. Im Objektinspektor finde ich auch bei keinen der Verwendeten DBX-Komponenten eine Eigenschaft um die Curserlocation zu setzen.
|
AW: seltsamer MSSQL 2005 Fehler
Welches Select (welche Tabellen) stecken hinter VPERS?
|
AW: seltsamer MSSQL 2005 Fehler
Die Abfrage 'SELECT * FROM Per' steckt hinter VPers.
|
AW: seltsamer MSSQL 2005 Fehler
Hm, ich hab vermutet, dass das Update auf die gleiche Tabelle geht wie das Select der Schleife.
Was steckt hinter dem ScalarQuery? Läuft das alles synchron? Sind die Datenquellen der sichtbaren Queries Tabellen oder Views? Ach ja, übersehen: vApt geht auch auf "Per" (was Du updatest) Das ist generell nicht unbedingt empfehlenswert vom Vorgehen. Keine Ahnung wie gut MSSQL2005 das verpackt, offenbar nicht so gut. |
AW: seltsamer MSSQL 2005 Fehler
Es geht ja alles. Nur beim 14 mal spuckt mein Programm mir hier den o.g. Fehler aus.
|
AW: seltsamer MSSQL 2005 Fehler
s.o.
|
AW: seltsamer MSSQL 2005 Fehler
Ich frage mich gerade, ob man das nicht alles in einem Statement erschlagen könnte. Das könnte allerdings zugegebenermaßen recht komplex werden. Allerdings müsste man dann auch auf das Logging verzichten.
|
AW: seltsamer MSSQL 2005 Fehler
Du solltest statt
Delphi-Quellcode:
besser mal
VMain.Insert;
Delphi-Quellcode:
verwenden.
VMain.Append;
Insert() macht im Prinzip das Gleiche wie Append() nur dass bei Insert() noch zusätzlicher Code ausgeführt wird, den man vermeiden sollte wenn es nicht unbedingt notwendig ist. Übrigens könntest du auch gleich noch die Kurzschreibweise verwenden:
Delphi-Quellcode:
// lange Schreibweise
VMain.FieldByName('PE_ID').Value := ... // Kurzschreibweise VMain['PE_ID'] := ... |
AW: seltsamer MSSQL 2005 Fehler
Das war Quatsch mit "Per" & update, das update geht ja auf vMain.
Der Vorschlag von DeddyH könnte aber trotzdem hilfreich sein, Pers und Abt in einem zu selektieren (wenn ich das richtig verstanden hab) |
AW: seltsamer MSSQL 2005 Fehler
Ist das nicht noch aufwendiger für die DB wenn ich alles in eine Abfrage packe? Bzw. wird es der gleicheaufwand sein, nur das dann alles auf einmal kommen würde.
|
AW: seltsamer MSSQL 2005 Fehler
Was heißt schon alles?
Die Abt Suche in die Hauptschleife reinzunehmen, find ich einen Versuch wert. Klingt nach Person und Abteilung, wenn ja, werden vermutlich auch nicht viel mehr Daten bewegt. Und vor allem macht der Server das dann aus einem Guss, was man ihm ruhig zutrauen darf. Wie groß ist eigentlich das Datenvolumen der betroffenen Tabellen? Der Rest kommt ja aus einer ganz anderen DB. Es ist natürlich sinnvoll, die Abfragen auf Ausführungsplan zu prüfen. Vlt fehlt irgendwo ein Index. Das Problem bei der Fehlermeldung ist zumindest für mich, dass ich in der Form nicht mal weiß, ob es eine Server Fehlermeldung ist, oder bspw. aus der Provider Ebene kommt. Ich bin kein MS SQL Kenner. |
AW: seltsamer MSSQL 2005 Fehler
Also wenn ich für jede Query eine eigene Connection anlege, dann geht alles wunderbar.
|
AW: seltsamer MSSQL 2005 Fehler
Das erhöht natürlich die Anzahl der Serververbindungen (vlt. unnötig).
Aber wahrscheinlich wird dieser Code hier sowieso nicht von hunderten Clients verwendet. |
AW: seltsamer MSSQL 2005 Fehler
Mein Programm wird nur einmal ausgeführt und dann liegt das Programm auf meiner Festplatte rum. Und da es morgen fertig werden soll, erstelle ich lieber mehrere Connections als morgen noch nach einer richtige Lösung zu suchen. Vielen Dank noch an alle die mir geholfen haben.
|
AW: seltsamer MSSQL 2005 Fehler
Zitat:
Das erinnert irgendwie an "Sie sitzen den ganzen Tag am Schreibtisch, Sie können doch gar keinen Stress haben" |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz