Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem: Dokument in Datenbank speichern (https://www.delphipraxis.net/86857-problem-dokument-datenbank-speichern.html)

emsländer 20. Feb 2007 16:28

Datenbank: MSSQL • Version: 2005 SP2 • Zugriff über: ADO und direkt

Problem: Dokument in Datenbank speichern
 
Moin,

noch ein kleines Problem. Ich habe ein DB-Feld mit der Bezeichnung dokument (varchar(max)). In dieses soll ein Word/RTF Dokument gespeichert werden. Da dieses ohne Kodierung nicht funzt, arbeite ich mit base64en/decode. Allerdings ist das DB-Feld immer leer. Lasse ich das base64 weg, klappt das Speichern soweit. Allerdings gibts Probleme, wenn was anderes als Plain Text kommt.
Delphi-Quellcode:
function unterlagen_indb : boolean;
  var datei : string;
      lfdnr : string;
      _text64 : string;
      fstream : Tfilestream;
      sstream : Tstringstream;
      erg   : integer;
begin
  lfdnr := AktenManager.grid_unterlagenverwaltung.cells[0,AktenManager.grid_unterlagenverwaltung.selectedrow];
  if AktenManager.OpenDialog1.Execute then begin
    datei := aktenmanager.opendialog1.FileName;
    try
      fstream := tfilestream.Create(datei,fmopenread);
      sstream := tstringstream.create('');
      fstream.position := 0;
      sStream.CopyFrom(fstream,fstream.size);
      sStream.Position := 0;
      _text64 := base64encode(sSTream.DataString);
      erg := update_unterlagen(lfdnr, _text64);
      showmessage('Result: '+inttostr(erg));
      _text64 := '';
    finally
      freeandnil(fstream);
      freeandnil(sStream);
    end;
  end;
end;

function update_unterlagen(lfdnr, inhalt : string) : integer;
  var _stmp : string;
   _query : TAdoquery;
begin
  result := 0;
  _query := TADOquery.Create(nil);
  with _query do begin
     datasource := AktenManager.Datasource_fdd;
     connection := AktenManager.ADOConnFDD;
     try
      _stmp := 'update vertragswerk set dokument = '''+inhalt+ ''' where lfdnr = '+lfdnr;
      sql.Add(_stmp);
      result := ExecSQL;
     except
      result := 99;
     end;
   end;
   freeandnil(_query);
end;
Hat auch jemand da einen Tipp?`

Gruss

EL

Jürgen Thomas 20. Feb 2007 17:15

Re: Problem: Dokument in Datenbank speichern
 
Hallo,

das Problem muss wohl in der DB beseitigt werden. Textfelder, z.B. varchar(max), können natürlich nur "plain text" speichern; RTF dürfte also kein Problem sein. Für binäre Felder steht BLOB zur Verfügung (ob auch in MySQL, weiß ich nicht, nehme es aber an). Gruß Jürgen

marabu 20. Feb 2007 17:51

Re: Problem: Dokument in Datenbank speichern
 
Hallo Emsländer,

entferne die Zeile 36 aus deinem Quelltext - oder erkläre mir, welchen Wert AktenManager.Datasource_fdd.Dataset hat.

Delphi-Quellcode:
// ...
    with _query do begin
      // datasource := AktenManager.Datasource_fdd;
      connection := AktenManager.ADOConnFDD;
// ...
Grüße vom marabu

emsländer 20. Feb 2007 17:52

L
 
Zitat:

Zitat von Jürgen Thomas
Hallo,

das Problem muss wohl in der DB beseitigt werden. Textfelder, z.B. varchar(max), können natürlich nur "plain text" speichern; RTF dürfte also kein Problem sein. Für binäre Felder steht BLOB zur Verfügung (ob auch in MySQL, weiß ich nicht, nehme es aber an). Gruß Jürgen

Hi Jürgen,

bei MYSQL ist es blob. Ich arbeite aber mit MSSQL 2005. Dort gibts kein BLOB.


Gruss

EL

emsländer 20. Feb 2007 17:56

Re: Problem: Dokument in Datenbank speichern
 
Zitat:

Zitat von marabu
Hallo Emsländer,

entferne die Zeile 36 aus deinem Quelltext - oder erkläre mir, welchen Wert AktenManager.Datasource_fdd.Dataset hat.

Delphi-Quellcode:
// ...
    with _query do begin
      // datasource := AktenManager.Datasource_fdd;
      connection := AktenManager.ADOConnFDD;
// ...
Grüße vom marabu

Hi Marabu,

AktenManager.Datasource_fdd.Dataset hat den Wert ADOTable_fdd

daran scheint es wahrscheinlich nicht zu liegen, denn gebe ich nur reinen Text ein, klappts.

Ich bin inzwischen etwas weiter. Habe aus dem varchar(max) image gemacht. Nur kommt beim Wiedereinlesen nur Blödsinn bei rum. Das wird nicht sauber decodiert *fluch*

Gruss

EL

Jürgen Thomas 20. Feb 2007 17:57

Re: Problem: Dokument in Datenbank speichern
 
Sorry, ich habe nicht genau genug hingeschaut. Bei MSSQL wird varbinary angeboten. Aber wenn Du einen Fachmann für MSSQL und/oder ADO bekommst, bist Du natürlich besser dran. Jürgen

stifflersmom 20. Feb 2007 17:58

Re: L
 
Zitat:

Zitat von emsländer
Hi Jürgen,

bei MYSQL ist es blob. Ich arbeite aber mit MSSQL 2005. Dort gibts kein BLOB.


Gruss

EL

Da täuscht Du dich aber,
Mssql kennt sehr wohl den Datentyp Blob
Genau nennt der sich Blob:Image

emsländer 20. Feb 2007 17:59

Re: L
 
Zitat:

Zitat von stifflersmom
Zitat:

Zitat von emsländer
Hi Jürgen,

bei MYSQL ist es blob. Ich arbeite aber mit MSSQL 2005. Dort gibts kein BLOB.


Gruss

EL

Da täuscht Du dich aber,
Mssql kennt sehr wohl den Datentyp Blob
Genau nennt der sich Blob:Image

Hi Jürgen,

das habe ich inzwischen auch herausgefunden ;-)

Allerdings gibts immer noch Gezicke. Rein <> Raus *grummel*


Gruss

EL

stifflersmom 20. Feb 2007 18:04

Re: Problem: Dokument in Datenbank speichern
 
Seit wann heiß ich denn Jürgen... :-)

Um binäre daten in ein Blob-fled zu schieben,
mußt Du sie über einen Stream ansprechen, dann klappts auch.
Such doch einfach mal im forum nach Blob + Stream

Moin

marabu 20. Feb 2007 18:18

Re: Problem: Dokument in Datenbank speichern
 
Hallo,

es ist sehr selten, dass eine Query, welche du nur zum Aktualisieren eines Datensatzes dynamisch instanzierst, in eine Master-Detail-Beziehung eingebunden wird. Ich bleibe dabei: Lasse die DataSource-Eigenschaft der Query leer oder erkläre mir mal was du damit erreichen willst.

Zu deinem Speicherproblem: Text ist Text und ein Speichern von RTF sollte ein einem Feld vom Typ NVARCHAR eigentlich keine Probleme machen.

Delphi-Quellcode:
function update_unterlagen(lfdnr, inhalt : string) : integer;
begin
  with TADOquery.Create(nil) do
  begin
    try
      connection := AktenManager.ADOConnFDD;
      SQL.Text := 'update vertragswerk set dokument = :rtf where lfdnr = :lfdnr';
      Parameters.ParamValues['rtf'] := inhalt;
      Parameters.ParamValues['lfdnr'] := lfdnr;
      Result := ExecSQL;
    except
      Result := 99; // das geht aber auch besser ...
    end;
    Free;
  end;
end;
Freundliche Grüße


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