Announcement

Collapse
No announcement yet.

Record in Tabelle schreiben/lesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Record in Tabelle schreiben/lesen

    Hallo!<br>

    Ich habe eine, im Prinzip, sehr einfache Frage:<br>
    Unter MS SQL-Server möchte ich einen Record in ein (Blob-)Feld<br>
    schreiben und anschließend auslesen.<br>

    Die Methode zum Schreiben sieht etwa wie folgt aus:<br>

    try<br>
    MemoryStream := TMemoryStream.Create;<br>
    MemoryStream.WriteBuffer(Rec, SizeOf(Rec));<br>

    ADOTable.Edit;<br>
    BlobStream := ADOTable.CreateBlobStream(ADOTable.FieldByName('Te st'), bmReadWrite);<br>

    with ADOTable, Rec do begin<br>
    sText1 := FieldByName('Text1').AsString;<br>
    sText2 := FieldByName('Text2').AsString;<br>
    sText3 := FieldByName('Text3').AsString;<br>
    end;<br>

    BlobStream.WriteBuffer(Rec, SizeOf(Rec));<br>
    ADOTable.Post;<br>
    finally<br>
    MemoryStream.Free;<br>
    BlobStream.Free;<br>
    end;<br>

    Um den Record wieder auszulesen, benutze ich folgende Methode:<br>

    try<br>
    BlobStream := damDataModule.atbLicense.CreateBlobStream(ADOTable .FieldByName('Test'), bmRead);<br>

    MemoryStream := TMemoryStream.Create;<br>
    MemoryStream.LoadFromStream(BlobStream);<br>
    MemoryStream.ReadBuffer(Rec, SizeOf(Rec));<br>
    finally;<br>
    BlobStream.Free;<br>
    MemoryStream.Free;<br>
    end;<br>

    Das Record wird beim Auslesen jedoch nicht gefüllt! Gehe ich das<br>
    Problem von einer falschen Seite an? Für einen Tip wäre ich dankbar!<br>

    Regards,<br>

    André<br>

  • #2
    Hallo,

    in der Tat war bei ADO das Thema BLOb etwas unhandlich, allerdings steht ab ADO 2.5 das <b>Stream</b>-Objekt zur Verfügung. Das folgende Beispiel demonstriert, wie der Dateiinhalt in einer SQL Server 7-Datenbank abgelegt, wieder ausgelesen und unter einem anderen Dateiname gespeichert wird:
    <pre>
    { Ausgewählte Datei via Stream-Objekt von ADO in der SQL Server 7-Datenbank
    ablegen und gleich wieder aus der Datenbank auslesen und unter einem
    anderen Dateinamen abspeichern. }

    procedure TForm1.ToolButtonBLOBClick(Sender: TObject);
    resourcestring
    RS_SQL = 'SELECT ID, FileContents FROM StreamBLOBDemo WHERE 1 = 0';
    SELECT = 'SELECT ID, FileContents FROM StreamBLOBDemo WHERE ID = ';
    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 über Stream-Objekt auslesen und als Datei 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;
    </pre&gt

    Comment


    • #3
      Hallo!<br>

      Ok, Ok, hier von Records zu sprechen war vielleicht etwas<br>
      missverständlich - ich meinte natürlich strukturierte Typen!<br>

      Der verwendete strukturierte Typ sieht etwa so aus:<br>

      type<br>
      TPerson = Record<br>
      sName: String[20];<br>
      sVorname: String[15];<br>
      dDatum: TDateTime;<br>
      end;<br>

      Und diesen strukturierten Typ möchte ich in ein (Blob-)Feld legen<br>
      und später wieder rekonstruieren.<br>
      Ich hoffe, das eigentliche Problem ist jetzt etwas deutlicher!?<br>

      Regards,<br>

      André<br&gt

      Comment


      • #4
        Hallo,

        wenn der Stream als <b>adTypeBinary</b> deklariert wird, spielt es überhaupt keine Rolle, ob da der Inhalt einer EXE, einer Grafik oder eines Pascal-Records kommt. Anstelle von SaveToFile wird dann eben <b>Read</b> aufgerufen, um die Daten aus dem Stream-Objekt auszulesen und auszuwerten

        Comment

        Working...
        X