AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Server und FileStreams
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Server und FileStreams

Ein Thema von renekr · begonnen am 7. Aug 2006 · letzter Beitrag vom 12. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#1

SQL Server und FileStreams

  Alt 7. Aug 2006, 15:02
Datenbank: SQL Server 2005 • Version: 2005 STD • Zugriff über: ADO
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.
  Mit Zitat antworten Zitat
Chris1986

Registriert seit: 17. Jul 2003
Ort: Aachen
350 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: SQL Server und FileStreams

  Alt 7. Aug 2006, 15:34
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
Es gibt nur 10 Typen von Menschen auf der Welt:
Die, die Binärcode verstehen und die, die es nicht tun . . .
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: SQL Server und FileStreams

  Alt 7. Aug 2006, 15:49
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
  Mit Zitat antworten Zitat
HendrikM

Registriert seit: 30. Aug 2005
Ort: Berlin
49 Beiträge
 
#4

Re: SQL Server und FileStreams

  Alt 8. Aug 2006, 12:13
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: SQL Server und FileStreams

  Alt 10. Aug 2006, 14:58
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;
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: SQL Server und FileStreams

  Alt 12. Aug 2006, 13:14
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.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: SQL Server und FileStreams

  Alt 12. Aug 2006, 16:20
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: SQL Server und FileStreams

  Alt 12. Aug 2006, 16:30
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.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: SQL Server und FileStreams

  Alt 12. Aug 2006, 16:43
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: SQL Server und FileStreams

  Alt 12. Aug 2006, 17:02
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.
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