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