Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Blobfield bei ADO (https://www.delphipraxis.net/60876-blobfield-bei-ado.html)

Jelly 13. Jan 2006 13:39

Datenbank: / • Version: / • Zugriff über: ADO nativ

Blobfield bei ADO
 
Ich habe folgende Funktion zum Updaten eines Records in einer DB-Tabelle:
Delphi-Quellcode:
function TMailTemplateDatabase.UpdateTemplate (RecordID : integer ; Subject : string ; TemplateFilename : string ) : boolean ;
var
  aRS  : _RecordSet;
  aOleV : OleVariant;
  sSQL : string ;
  FConnection : string ;
  Dummy : string ;
  aStr : TMemoryStream ;
begin
  aStr := TMemoryStream.create ;
  aSTR.LoadFromFile(TemplateFilename);
  aSTR.position := 0 ;

  aRS := CoRecordSet.Create;
  aRS.CursorLocation := adUseServer;
  with FDatabaseInfo do begin
     sSQL := format('select %s, %s from %s where %s=%d',
                    [Subject,Body,Tablename,ID,RecordID]
                    ) ;
     FConnection := ConnectionString ;
  end ;
  try
    aRS.Open(sSQL, FConnection,adOpenStatic, adLockOptimistic, adCmdText);
    aRS.Collect[0] := Subject ;
    aOleV := StreamToOleVariant (aSTR,aSTR.size) ;
    aRS.Collect[1] := aOleV ;  // --> Hier knallt's
    OleVariant (aRS).Update;
  finally
    aRS.Close;
  end;

end;
Der Code klappt auch soweit, bis auf das Problem, dass das Blobfeld aRS.Collect[1] mir Probleme bereitet. Als RuntimeFehlermeldung kommt dann: Der Vorgang ist in diesem Zusammenhang nicht zugelassen.

Wie kann ich denn nun mein Blobfeld, welches in aOleV gespeichert ist, in der Tabelle updaten?

Bernhard Geyer 13. Jan 2006 13:44

Re: Blobfield bei ADO
 
Such mal im Entwickler-Forum nach "ADO Kosch blob"

Jelly 13. Jan 2006 13:54

Re: Blobfield bei ADO
 
Der geht einen anderen Weg, mittels _Stream.

In welcher unit ist denn _Stream deklariert?

Delphi-Quellcode:
var
  aADOStream : _Stream;
  aRS       : _RecordSet;
  iID       : Integer;
  vSQL      : OleVariant;
begin
  // Step 1: ADO-Stream-Objekt initialisieren
  aADOStream := CoStream.Create;
  aADOStream.Type_ := adTypeBinary;
  aADOStream.Open(EmptyParam, adModeUnknown,
                  adOpenStreamUnspecified, '', '');
  aADOStream.LoadFromFile(FFileName);
  // Step 2: ADO-Recordset-Objekt initialisieren
  aRS := CoRecordset.Create;
  aRS.CursorLocation := adUseClient;
  vSQL := RS_SQL;
  aRS.Open(vSQL, ADOConnection1.ConnectionObject,
           adOpenStatic, adLockOptimistic, adCmdText);
  // Step 3: Neuen Datensatzpuffer anfordern
  aRS.AddNew(EmptyParam, EmptyParam);
  iID := StrToInt(EditID.Text);
  // Step 4: Werte zuweisen, BLOb aus Stream-Objekt zuordnen
  aRS.Fields.Item['ID'].Value := iID;
  aRS.Fields.Item['FileContents'].Value := aADOStream.Read(adReadAll);
  // Step 5: Datensatz speichern
  aRS.Update(EmptyParam, EmptyParam);
  aRS.Close;
  aADOStream.Close;
  aRS := nil;
  aADOStream := nil;
  // Step 6: Datensatz zur Kontrolle neu einlesen
  aRS := CoRecordset.Create;
  vSQL := SELECT + IntToStr(iID);
  aRS.Open(vSQL, ADOConnection1.ConnectionObject,
           adOpenForwardOnly, adLockReadOnly, adCmdText);
  // BLOb-Inhalt via Stream-Objekt auslesen und speichern
  aADOStream := CoStream.Create;
  aADOStream.Type_ := adTypeBinary;
  aADOStream.Open(EmptyParam, adModeUnknown,
                  adOpenStreamUnspecified, '', '');
  aADOStream.Write(aRS.Fields.Item['FileContents'].Value);
  aADOStream.SaveToFile(FSaveFileName, adSaveCreateOverWrite);
  aADOStream.Close;
  aRS.Close;
  Inc(iID);
  EditID.Text := IntToStr(iID);
end;

Jelly 13. Jan 2006 15:09

Re: Blobfield bei ADO
 
:twisted: + :wall: zum Quadrat :twisted:

Jetzt such ich schon den ganzen Nachmittag nach der Lösung... Und woran lags: Hatte in meiner MSSQL Tabelle für das Blobfield den Datentyp binary gewählt, anstatt image.

Jetzt klappts auf Anhieb... Oh Mann... Ich liebe solche produktiove Freitagnachmittage.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 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