Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

TDBXError: Reader-hat-keine-weiteren-Zeilen

  Alt 5. Jan 2013, 13:58
Datenbank: MySQL • Version: 5.xx • Zugriff über: DBExpress
Hi zusammen

Um es gleich vorwegzunehmen: dies ist ein Doppelpost.

Es geht darum, Bilder in eine Datenbank einzufügen; nebst den absoluten Rohdaten im Nef-Format sollen aus diesen Thumbnails im jpeg-Format in eine Bildtabelle gespeichert werden. Das für sich klappt soweit. Auch das Abholen des letzten Autoinc-Wertes nach der Einfüge-Operation war erstmal erfolgreich, und so konnten auch verknüpfte Tabellen ihre Werte erhalten.
Aber dann gings los. Was genau der Grund, bzw. die bevorstehende Änderung war, kann ich leider nicht mehr nachvollziehen. Auf jeden Fall löschte ich mal alle Testdaten, die sich in der DB angesammelt hatten und vollzog die Änderungen. Und seither meint Delphi jedes mal, wenn das Ergebnis der Abfrage 'SELECT LAST_ID' in eine Variable geschrieben werden soll, der Reader hätte keine weiteren Zeilen...

Ein Codeschnipsel aus der zuständigen Prozedur, nachdem ich von der Abfrage der Serverfunktion 'SELECT_LAST_ID' testweise auf ein nach dem höchsten Wert suchenden SQL-Statement umgestiegen war:
Delphi-Quellcode:
      ...
      SQLString := 'Insert Into Bildtabelle(Thumbnail, NEF) Values (:FThumbMemory,:FNefMemory)';
      DelborDataMod.SQLDataSetXE.CommandType := (ctQuery);
      DelborDataMod.SQLDataSetXE.CommandText := SQLString;
      DelborDataMod.SQLDataSetXE.Params.CreateParam(ftBlob, 'FThumbMemory', ptInput);
      DelborDataMod.SQLDataSetXE.Params.CreateParam(ftBlob, 'FNefMemory', ptInput);
      DelborDataMod.SQLDataSetXE.Params[0].LoadFromStream(FThumbMemory, ftgraphic);
      DelborDataMod.SQLDataSetXE.Params[1].LoadFromStream(FNefMemory, ftgraphic);
      DelborDataMod.SQLDataSetXE.ExecSQL(false);
      DelborDataMod.SQLDataSetXE.Close;
    SelectLastId(SQLString);
      Progressbar1.Position := Progressbar1.Position+1;
      Application.ProcessMessages;
    FReportList.Add(' '+ IntToStr(i)+'-TPicAdmin.BildTabelleInsert');
    FReportList.Add(' ');
      BildDescribeTabelleInsert(BildTabelleLastId,BildName);
    end;
  finally
  ...
Und SelectLastID:

Delphi-Quellcode:
procedure TPicAdmin.SelectLastId(SQLString: string);
begin
  SQLString := 'Select MAX(idBild) from Bildtabelle';
  // SQLString := 'Select Last_Insert_ID()';
  // DelborDataMod.SQLDataSetXE.GetMetadata := true;
  // DelborDataMod.SQLDataSetXE.SetSchemaInfo(stIndexes,'Bildtabelle','nil',''); //
  DelborDataMod.SQLDataSetXE.CommandType := (ctQuery);
  DelborDataMod.SQLDataSetXE.CommandText := SQLString;
  DelborDataMod.SQLDataSetXE.Open;
  DelborDataMod.SQLDataSetXE.First;
  while not DelborDataMod.SQLDataSetXE.Eof do
  begin
    LbxLastID.Items.Add(IntToStr(DelborDataMod.SQLDataSetXE.Fields[0].AsInteger));
  end;
end;
Aufgerufen wird diese Prozedur hier:

Delphi-Quellcode:
procedure TPicAdmin.Alle_oeffnenClick(Sender: TObject);
  var Seitenlaenge: Integer; AUser, APass: String;
      Transaction : TDBXTransaction;
begin
  OpenDlg.Filetype := '.NEF';
   APass := CM_Main.ProjektFrame1.MaskEdit1.Text;
  AUser := CM_Main.ProjektFrame1.Edi_User.Text;
  Seitenlaenge := 100;
  if OpenDlg.ShowModal = mrOK then begin
    if DelborDataMod.GetSQLConnection(AUser,APass) then begin
      DelborDataMod.SQLDataSetXE.SQLConnection := DelborDataMod.SQLConnectionXE;
      Transaction := DelborDataMod.SQLConnectionXE.BeginTransaction;
      DelborDataMod.SQLConnectionXE.KeepConnection := true;
      DelborDataMod.SQLConnectionXE.AutoClone := true;
      LbxLastId.Items.Add('ActiveStatements := ' + IntToStr(DelborDataMod.SQLConnectionXE.ActiveStatements));
      LbxLastId.Items.Add('MaxStmtsPerConn := ' + IntToStr(DelborDataMod.SQLConnectionXE.MaxStmtsPerConn));
      // MaxStmtsPerConn- Wert := 1 / Readonly
      DelborDataMod.SQLDataSetXE.Prepared := false;
    FReportList.Add(' - TPicAdmin.Alle_oeffnenClick');
      BildTabelleInsert2(Seitenlaenge);
    FReportList.Add(' - TPicAdmin.Alle_oeffnenClick');
    WriteReportFile; //<== erstellt eine Reportdatei zur Ausgabe von Variablenwerte etc.
      DelborDataMod.SQLConnectionXE.CommitFreeAndNil(Transaction);
    end;
  end;
end;
Für Interessierte habe ich die komplette Bildinsert-Prozedur als Pdf angehängt; ich finde, sie ist etwas zu monströs, um sie hier in voller Länge zu posten.

Ich gehe mal davon aus, dass die Variable 'MaxStmtsPerConn' ihren Wert vom MySQL-Server erhält und habe da nach einer entsprechenden Variablen gesucht. Bisher allerdings erfolglos.

Ich hab mich auch schon in Embarcaderos Seiten zum DBX-Framework vertieft, alllerdings bis jetzt mit eher unbefriedigendem Ergebnis - entweder steht da nichts über das was ich suche, oder ich habs überlesen...

Was mache ich falsch?

Für eure Antworten schon mal vielen Dank!

Gruss
Delbor
Angehängte Dateien
Dateityp: pdf procedure TPicAdmin2.pdf (8,7 KB, 2x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat