Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi seltsamer MSSQL 2005 Fehler (https://www.delphipraxis.net/164643-seltsamer-mssql-2005-fehler.html)

Kevin11 23. Nov 2011 09:35

Datenbank: MSSQL • Version: 2005 • Zugriff über: DBX

seltsamer MSSQL 2005 Fehler
 
Hallo,

ich bekomme mitten in meiner while Schleife plötzlich diesen Fehler:
Zitat:

connection is busy with results for another command
Die ersten 13. Datensätze kann ich Problemlos auslesen, nur bei dem 14. kommt dann dieser Fehler. Und ich habe nicht mehr als 5 Abfragen in dieser Schleife. Also kann die Connection ja nicht zu beschäftigt sein.

MfG
Kevin

DeddyH 23. Nov 2011 09:47

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?

Kevin11 23. Nov 2011 10:07

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;
.

Bernhard Geyer 23. Nov 2011 10:14

AW: seltsamer MSSQL 2005 Fehler
 
Wie so oft die Frage:

Welche Curserlocation wird verwendet? Für MS SQL-Server sollte man clUseClient verwenden.

omata 23. Nov 2011 10:14

AW: seltsamer MSSQL 2005 Fehler
 
Und in welche Tabelle schreibt VMain?

Kevin11 23. Nov 2011 10:20

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.

jobo 23. Nov 2011 10:28

AW: seltsamer MSSQL 2005 Fehler
 
Welches Select (welche Tabellen) stecken hinter VPERS?

Kevin11 23. Nov 2011 10:32

AW: seltsamer MSSQL 2005 Fehler
 
Die Abfrage 'SELECT * FROM Per' steckt hinter VPers.

jobo 23. Nov 2011 10:43

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.

Kevin11 23. Nov 2011 10:49

AW: seltsamer MSSQL 2005 Fehler
 
Es geht ja alles. Nur beim 14 mal spuckt mein Programm mir hier den o.g. Fehler aus.

jobo 23. Nov 2011 10:50

AW: seltsamer MSSQL 2005 Fehler
 
s.o.

DeddyH 23. Nov 2011 10:51

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.

shmia 23. Nov 2011 10:55

AW: seltsamer MSSQL 2005 Fehler
 
Du solltest statt
Delphi-Quellcode:
VMain.Insert;
besser mal
Delphi-Quellcode:
VMain.Append;
verwenden.
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'] := ...

jobo 23. Nov 2011 11:01

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)

Kevin11 23. Nov 2011 12:01

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.

jobo 23. Nov 2011 13:09

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.

Kevin11 23. Nov 2011 14:14

AW: seltsamer MSSQL 2005 Fehler
 
Also wenn ich für jede Query eine eigene Connection anlege, dann geht alles wunderbar.

jobo 23. Nov 2011 14:34

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.

Kevin11 23. Nov 2011 14:45

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.

mquadrat 23. Nov 2011 15:08

AW: seltsamer MSSQL 2005 Fehler
 
Zitat:

Und ich habe nicht mehr als 5 Abfragen in dieser Schleife. Also kann die Connection ja nicht zu beschäftigt sein
:lol: :lol:

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 04:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz