![]() |
Datenbank: / • Version: / • Zugriff über: ADO nativ
Blobfield bei ADO
Ich habe folgende Funktion zum Updaten eines Records in einer DB-Tabelle:
Delphi-Quellcode:
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.
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; Wie kann ich denn nun mein Blobfeld, welches in aOleV gespeichert ist, in der Tabelle updaten? |
Re: Blobfield bei ADO
Such mal im
![]() |
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; |
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