Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Server und FileStreams (https://www.delphipraxis.net/74679-sql-server-und-filestreams.html)

renekr 7. Aug 2006 15:02

Datenbank: SQL Server 2005 • Version: 2005 STD • Zugriff über: ADO

SQL Server und FileStreams
 
Hi,
ich habe vor eine Datei in die DB zu speichern per BlobStream.

Ich habe leider in dieser Richtung noch keine Erfahrung.

Wäre über einige tips sehr dankbar.

Zb.: welchen Datentyp benötige ich in der Datenbank um einen BlobStrema zu speichern ?

Das selbe kann ich ja dann auch mit einem Memo Feld machen?
Ich habe da früher die Probleme gehabt mit dem #13#10 Zeichen.
Das habe ich dann in meienr Applikation umgewandelt,also rausgeschnitten beim laden oder speichern shcon.

Aber denke das ginge auch einfacher.

danke.

Chris1986 7. Aug 2006 15:34

Re: SQL Server und FileStreams
 
Hi,
ich weiß nicht, ob es bei allen DB-Typen gleich ist, aber es wird zumindest ähnlich sein. Ich gehe hier mal davon aus, das du eine mySQL DB benutzt. Das Feld, in das du Daten speichern willst muss vom Typ Blob oder LongBlob sein. Habe jetzt schon länger nichts mehr mit Delphi gemacht. Aber ich meine, es gibt eine Klasse TBlobstream, mit der sich Blob-Felder leicht lesen umd schreiben lassen. Such einfach mal im Forum.

Du solltest dich aber fragen, ob es wirklich nötig ist die Daten in eine Datenbank zu legen Denn zumindest bei einer mySQL Datenbank hat das ganze nicht nur Vorteile. Die maximale größe des Feldes ist auf 1MB eingestellt ( kann man wohl ändern), es kann immer nur das gesammte Blob-Feld gelesen werden und einige PHP-Entwickler behaupten, dass Abfragen erheblich langsamer werden, auch wenn gerade kein Blob-Feld abgefragt wird.

Zu deinem Problem mit #13#10:

in PHP gibts die Funktion addslashes() die setzt vor jedes Sonderzeichen(damit mein ich jetzt Zeilenumbrüche, etc) einen Backslash. Was widerum dafür sorgt, das das gewünschte Sonderzeichen in die DB geschrieben wird.

MfG
Christian

renekr 7. Aug 2006 15:49

Re: SQL Server und FileStreams
 
Hi,
Danke.

Aber wie oben angegeben verwende ich SQL Sever 2005 STD Edition.

Da habe ich keine Blob Felder oder Typen.
nur Image,Binary,VarBinary(Max) bei 2005 er Version ) neuer Datentyp.

Das mit #13#10 will ich nicht drin haben in der DB.
da es komische Sachen ,also Umbrüche beim lesen macht.

Deswegen prüfe ich es beim Save oder Load from DB,also den String.

Was nciht imemr schön ist und Programmieraufwand fordert.


Die Größe is mir egal,weil ich eigentlich nur eine Datei rein machen will,andere habe ich per File Share abgelegt.
Aber ich will es mal testen mit dem Streamen.

danke

HendrikM 8. Aug 2006 12:13

Re: SQL Server und FileStreams
 
Hallo,
der geeignete Feldtyp ist image.
Zum Schreiben (und Lesen) muss das Feld persistent in Deinem Code vorhanden sein (z.B. per Feldeditor "alle Felder hinzufügen").
Ich hab das mal T_BLOB genannt.
Dann folgendes:
1. entsprechenden Datensatz öffnen (T_ ist TADODataset)
F_Name ist der vollständige Pfadname der Datei die auf das feld eingelesen werden soll.

2.
Delphi-Quellcode:
procedure ThisEdit;
var aBS:TADOBlobStream;
begin
     try
        T_.edit;
        aBS:=TADOBlobStream.Create(T_BLOB,bmwrite);
        aBS.LoadFromFile(F_NAME);
     finally
            aBS.Free;
     end;
     T_.post;
end;
3. Zum Auslesen:
Delphi-Quellcode:
var aBS:TADOBlobStream;
begin
   try
          DeleteFile(F_Name); // falls schon vorhanden
        aBS:=TADOBlobStream.Create(T_BLOB,bmread);
          aBS.SaveToFile(F_Name);
     finally
        aBS.Free;
     end;
end;
hendrik

renekr 10. Aug 2006 14:58

Re: SQL Server und FileStreams
 
Hi,

Danke .
Das klappt.
Aber ich stelle mcih ein wenig Dumm an beim Insert und oder Update.

Wie ist das mit dem TADO Blob und TBlob.. ? Das TBlob ist ja von der DB unit und die AdoBlob vom ADODB.
Da ich nur per Ado connecte wil lci hdas auch so machen aber denke das is falsch.
Das TADOBLOBFIELD geht net.
Aber ich glaube ich bin grad am Falschen Ende. *GG*

Hast du mir ev. ein bisschen Code,ich weiß aber i peil das einfach nicht so richtig.

Wie gesagt das sind meine Ersten Schritte mit File Stream ousw.
PS: was is den der Unterschied zw. BlobStream,Filestream,MemoryStream usw.?

Vielen dank.

Auslesen:
Delphi-Quellcode:

procedure TForm1.Button4Click(Sender: TObject);
var aBS:TADOBlobStream;
begin
   try
    adoquery1.sql.text:='select * from test where (ID =4) ';
    adoquery1.active:=true;
    DeleteFile('\\oeka\Bilder$\k2.jpg'); // falls schon vorhanden
    aBS:=TADOBlobStream.Create(ADOQUERY1.FieldByName('Rave') as TBlobField,bmread);
    aBS.SaveToFile('\\oeka\Bilder$\k2.jpg');
     finally
        aBS.Free;
     end;
end;

renekr 12. Aug 2006 13:14

Re: SQL Server und FileStreams
 
hi,
ich habe nun ein bisschen rum getestet und noch Fehelr:
Zb: Ungültige Typ Umwandlung usw.

Kann mir jemand helfen?

Ich benutze ADO auf einem SQL Server 2005.
Habe es auch schon mit TADOBLOBStream und Query anstelle von ADOQuery versucht aber da kommen andere Probleme.
Wie man sieht will ich es in ein RVProject Laden.

code:
Delphi-Quellcode:
procedure TForm1.LoadClick(Sender: TObject);
var
  BS: TblobStream;
begin
  with ADOquery1 do
  begin
    sql.text:='select * from _Test_Rave where (ID =12) ';
    Active := True;
    if RecordCount = 1 then
    begin
      BS := TblobStream.Create(FieldByName('Rave') as TBlobField, bmRead);
      try
        RaveProject.New;
        RaveProject.LoadFromStream(BS);
      finally
        BS.Free;
      end;
    end;
    Active := False;
  end;

end;

Danke.

omata 12. Aug 2006 16:20

Re: SQL Server und FileStreams
 
Hallo renekr,

versuch es doch mal so...

Delphi-Quellcode:
procedure LoadRave(Spalte:string; Query:TADOQuery; Rave:TRvProject);
var Stream:TStream;
    Field:TField;
begin
  if assigned(Query) and assigned(Rave) then begin
    if Query.Active then begin
      Field:=Query.FieldByName(Spalte);
      if assigned(Field) then begin
        if Field.IsBlob then begin
          Stream:=Query.CreateBlobStream(Field, bmRead);
          try
            Rave.New;
            Rave.LoadFromStream(Stream);
          finally
            Stream.Free;
          end;
        end;
      end;
    end;
  end;
end;

procedure SaveRave(Spalte:string; Query:TADOQuery; Rave:TRvProject);
var Stream:TStream;
    Field:TField;
begin
  if assigned(Query) and assigned(Rave) then begin
    if Query.Active then begin
      Field:=Query.FieldByName(Spalte);
      if assigned(Field) then begin
        if Field.IsBlob then begin
          Query.Edit;
          Stream:=Query.CreateBlobStream(Field, bmWrite);
          try
            Rave.SaveToStream(Stream);
          finally
            Stream.Free;
          end;
          Query.Post;
        end;
      end;
    end;
  end;
end;
Aufruf:
Delphi-Quellcode:
procedure TForm.RaveLadenClick(Sender: TObject);
begin
  ADOquery1.SQL.Text:=
    'SELECT *'#13 +
    'FROM _Test_Rave'#13 +
    'WHERE id = 12';

  ADOquery1.Open;
  LoadRave('rave', ADOQuery1, RaveProject);
end;

procedure TForm.RaveSpeichernClick(Sender: TObject);
begin
  // Query muss offen sein, Rave wird in aktueller Zeile gespeichert
  RaveProject.New;
  SaveRave('rave', ADOQuery1, RaveProject);
end;
Gruss
Thorsten

renekr 12. Aug 2006 16:30

Re: SQL Server und FileStreams
 
Hi thorsten,

Danke erstmals.
Das sieht mal gut aus.

So wie ich das sehe hast du den TADOBlobStream durch nen TStream ersetzt.

Kannst du mir ev. noch die Unterschiede zw. den verschiedenen Stream erklären?
Wie ich oben schon mal gefragt habe?

PS: Kannst du mir ev. sagen was an meiner Funktion falsch ist,im Grunde ist diese ja Ähnlich nur mit dem Stream,das habe ich auch Probiert,kommt aber Zugriffsverletzung.
Will ja wissen was falsch ist und es auch verstehen.


Danke vielmals.

omata 12. Aug 2006 16:43

Re: SQL Server und FileStreams
 
Hallo renekr,

ich wollte dir gern helfen, hatte vorher noch nichts mit Blobfeldern gemacht. Also in der Datenbank deine Struktur erstellt und dann wollte ich einen leeren Rave-Report zum Testen in die Datenbank schreiben. Aber wie? Hier im Forum bin ich dann auf das Schreiben über Query.CreateBlobStream(Field, bmWrite) gestossen. Dann konnte ich deinen Code ausprobieren bzw. wollte ihn untersuchen und abändern. Dabei viel mir auf, dass im Konstruktor von TBlobStream ein Typcast auf TBDEDataSet gemacht wird. Da war mir dann klar das das nicht gehen wird, weil du ja ADO einsetzt. Also weg von TBlobStream! Die Idee war einfach, das Schreiben hatte ich - warum nicht das Lesen genauso realisieren? Gedacht -> Getan. Fertig.

Beantwortet deine Frage wohl nicht so ganz, aber so war das...

PS: Du hast also gar nichts falsch gemacht, die Borländer waren es.

Gruss
Thorsten

renekr 12. Aug 2006 17:02

Re: SQL Server und FileStreams
 
Hi,

Danke schön.
Das habe ich mir ja auch shcon gedacht .
Weil TBlob.. vom uses DB und nciht vom AdoDB stammt.

Da war mir auch klar das wo was Krachen würde.

Aber wie gesagt,habe noch nix in der Richtung gemacht um den Fehler zu finden.

Aber ich habe in meinem Source das selbe ersetzt wie du , mit TStream und es ging auch nicht,also iergendwo muss nochwo was falsch sein.

Ev. was mit den Assign.
aber mal schaun ,ev. bekomm i es noch raus.

Aber trotzdem Vielen dank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz