| Autor |
Beitrag |
Anateus
      
Beiträge: 16
|
Verfasst: Mi 09.02.11 19:04
Hallo,
ich habe eine Firebird-Datenbank Version 2.0, arbeite mit Delphi 7 und dbExpress.
Ich möchte in der Firbird-Tabelle
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| CREATE TABLE BILDMEM (GUID bigint NOT NULL, FIRM SMALLINT, NUMMER VARCHAR(20), ADRNUMMER VARCHAR(20), STATUS INTEGER NOT NULL, SBEGRIFF1 VARCHAR(80), SBEGRIFF2 VARCHAR(80), SBEGRIFF3 VARCHAR(80), LISTE VARCHAR(20), ART VARCHAR(10), ANWEND VARCHAR(50), BETREFF VARCHAR(80), VNAME VARCHAR(50), ABTEILUNG VARCHAR(20), VERSION VARCHAR(20), DART VARCHAR(2) NOT NULL, TEXT BLOB, BILD BLOB sub_type binary, bmdaed integer, bmaeui VARCHAR(20), bmaeuz integer, bmdand integer, bmanui VARCHAR(20), bmanuz integer, PRIMARY KEY(GUID)); |
in dem Tabellenfeld "BILD" eine PDF-Datei hinterlegen, wie folgt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| function TLiefer.DB_Versorgen_Doku : Boolean; var erfolg : Boolean; MyPDF : TFileStream; BelegArtBezeichnung : TCaption; AuftragsBereich : TCaption; begin try Result := false; MyPDF:=TFileStream.Create('c:\temp\beleg.pdf', fmOpenRead); MyPDF.Position:=0; erfolg := Beleg_Art(AuftragsArt, BelegArtBezeichnung); erfolg := Beleg_Bereich(AuftragsArt, AuftragsBereich); with DM101.IBILDMEM do begin Params[0].asInteger := DM001.getNextBildMemNumber; Params[1].asInteger := Mandant; Params[2].asString := ' '; Params[3].asString := ' '; Params[4].asInteger := 4; Params[5].asString := BelegArtBezeichnung; Params[6].asString := BNr.Text; Params[7].asString := DateToStr8(BDatum); Params[8].asString := BelegArtBezeichnung; Params[9].asString := 'PDF'; Params[10].asString := 'Acrobat Reader'; Params[11].asString := ' '; Params[12].asString := UpperCase(BelegArtBezeichnung); Params[13].asString := Auftragsbereich; Params[14].asString := '1'; Params[15].asString := 'B'; Params[16].asString := ' '; ParamByName('BILD').LoadFromStream(MyPDF,ftBlob); Params[18].asInteger := 0; Params[19].asString := ' '; Params[20].asInteger := 0; Params[21].asInteger := Datum_DB(DateToStr8(BDatum)); Params[22].asString := Usernr; Params[23].asInteger := Time_DB(TimeToStr(Now)); end; Result := true; finally MyPDF.free; end end;
function TLiefer.SpeicherRechnung : Boolean; var TD : TTransactionDesc; begin TD.TransactionID := getNextTransactionID; TD.IsolationLevel := xilREADCOMMITTED; DM101.SQLConnection1.StartTransaction(TD); try erfolg := DB_Versorgen_Doku; DM101.IBILDMEM.ExecSQL;
DM101.SQLConnection1.Commit(TD); Result := True; except DM101.SQLConnection1.Rollback(TD); MessageDlg('Datei zu groß oder fehlende Angaben', mtInformation, [mbOk], 0); Result := False; end;
Result := true end end; |
Es erscheint dann folgende Fehlermeldung:
"Im Projekt WWS.exe ist eine Exception der Klasse EDatabasError aufgetreten. Meldung: 'feature is not supported BLOB and array data types are not supported for move operation'. Prozess wurde angehalten."
Kann mir jemand weiterhelfen, wie ich eine PDF ordentlich in eine Firebird-Tabelle hineinbekomme?
Gruß
Anateus
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 10.02.11 08:05
Moin,
ich speicher u.A. Bilder in BLOB-Feldern. Das sieht dann so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TMySQLQuery.SetBlobParameterValue(AParamName: String; AValue: TPersistent); begin if (AValue = nil) then begin self.ParamByName(AParamName).Clear; self.ParamByName(AParamName).DataType := ftBlob; self.ParamByName(AParamName).Bound := True; end else begin self.ParamByName(AParamName).Assign(AValue); end;
end; |
Aufgerufen sieht es dann so aus:
Delphi-Quelltext 1:
| q.SetBlobParameterValue('BILD', imgHelfer.Picture); |
Andersrum siehts dann so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| pic := TPicture.Create; try pic.Assign(q.FieldByName('BILD') as TBlobField); imgHelfer.Picture := pic; finally pic.Free; end; |
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Anateus 
      
Beiträge: 16
|
Verfasst: Do 10.02.11 14:41
Danke für Deine Antwort.
Ich habe aber das Problem, ob ich das BLOB-Feld zur Aufnahme von PDF-Dateien richtig im "Create Table" der Firebird-Datenbank richtig definiert habe und dann auch wiederum richtig versorge.
Gruß
Anateus
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 16.04.11 18:19
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 17.04.11 00:54
Da gibts ja noch prinzipielle Überlegungen. Z.B.: wie oft werden diese PDF-Dateien geändert ? Die brauchen sehr viel Platz, zumindest im Verhältnis zu integer + Co. Die DB selbst wird sich schon oft ändern. Da stellt sich aber die Frage, ob es sinnvoll ist diese PDFs in der DB zu speichern, denn Alternative wäre, das schon in Dateien zu lassen und nur den Dateinamen in der DB zu speichern.
_________________ Gruß
Hansa
|
|
Anateus 
      
Beiträge: 16
|
Verfasst: Di 17.05.11 06:19
Hallo,
ich habe es jetzt rausbekommen. Es lag doch an der Zuweisung von Parametern, die
ich mit "asBLOB" (z.B. Params[16].asBlob) zuweisen musste und dann hatte ich
Params[16] nicht nochmal angegeben, weil ich das gleich mit "ParamByName"
befüllen wollte.
Hier nochmal die richtigen Zuweisungen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| function TLiefer.DB_Versorgen_Doku : Boolean; var erfolg : Boolean; MyPDF : TFileStream; BelegArtBezeichnung : TCaption; AuftragsBereich : TCaption; begin try Result := false; MyPDF:=TFileStream.Create('c:\temp\beleg.pdf', fmOpenRead); MyPDF.Position:=0; erfolg := Beleg_Art(IAuftragsArt, BelegArtBezeichnung); erfolg := Beleg_Bereich(IAuftragsArt, AuftragsBereich); with DM101.IBILDMEM do begin Params[00].asInteger := Mandant; Params[01].asString := ' '; Params[02].asString := ' '; Params[03].asInteger := 4; Params[04].asString := BelegArtBezeichnung; Params[05].asString := BNr.Text; Params[06].asString := DateToStr8(BDatum); Params[07].asString := BelegArtBezeichnung; Params[08].asString := 'PDF'; Params[09].asString := 'Acrobat Reader'; Params[10].asString := ' '; Params[11].asString := UpperCase(BelegArtBezeichnung); Params[12].asString := Auftragsbereich; Params[13].asString := '1'; Params[14].asString := 'B'; Params[15].asBlob := ''; Params[16].asBlob := ''; ParamByName('BILD').LoadFromStream(MyPDF,ftBlob); Params[17].asInteger := 0; Params[18].asString := ' '; Params[19].asInteger := 0; Params[20].asInteger := Datum_DB(DateToStr8(BDatum)); Params[21].asString := Usernr; Params[22].asInteger := Time_DB(TimeToStr(Now)); end; Result := true; finally MyPDF.free; end end; |
Ich danke Euch allen für Eure Hilfe.
Gruß
Anateus
|
|
|