Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: zysmo am 02.06.10 - 16:58:46

Titel: Attachment als Binary in Textfeld ablegen
Beitrag von: zysmo am 02.06.10 - 16:58:46
Hallo zusammen,

ich versuche einen Dateianhang aus einen Dokument (CRMdoc) aus einer Datenbank, in eine andere Datenbank im Binärformat in einem Textfeld (doc.Firmenlogo) zu speichern, damit ich es später verwenden kann um als blob in eine sql-Datenbank zu schreiben.

Mein Ansatz sieht  so aus:

Code
				
Dim File As Variant
Dim Object As NotesEmbeddedObject
Dim tempimage As Variant
If (CRMdoc.hasitem("$FILE")) Then
       Set File = CRMdoc.GetFirstItem("$FILE")
	Set Object = CRMdoc.GetAttachment(File.values(0))
	Call object.ExtractFile("c:\tmp\")
	fileNum% = Freefile()
	Open "c:\tmp\" & Object.Name For Binary As fileNum%
	Do While Not Eof(fileNum%)
		Get #fileNum%, ,tempimage
	Loop
	doc.Firmenlogo = tempimage
End If

Funktioniert so aber nicht....
Das
Code
Call object.ExtractFile("c:\tmp\")
wirft schon den Fehler, dass es C:\tmp nicht öffnen kann...?
Und selbst wenn ich ein Bild physikalisch auf die Platte lege und so versuche zu öffnen:
Code
Open "c:\tmp\bild.bmp" For Binary As fileNum%
, gibt mit das
Code
Get #fileNum%, ,tempimage
den Fehler, dass der Datentyp falsch ist  ???

Wo liegt mein Denkfehler  :-:

Grüße
Alex

Titel: Re: Attachment als Binary in Textfeld ablegen
Beitrag von: Peter Klett am 02.06.10 - 21:24:03
Bei Call object.ExtractFile("c:\tmp\") fehlt der Dateiname, probiers doch mal mit

Call object.ExtractFile("c:\tmp\" & object.Name).

Wenn ich die Hilfe zu Get richtig verstanden habe, passt die Declaration Dim tempimage As Variant nicht, das muss wohl etwas konkreter sein.
Titel: Re: Attachment als Binary in Textfeld ablegen
Beitrag von: pram am 02.06.10 - 21:48:14
und weiterhin Achtung: Textfelder eignen sich schlecht zum Speichern von Binarys.
Alle Textfelder *) in Summe dürfen pro Dokument nur eine Größe von 64k haben (~32k Zeichen)

*) sofern sie mit dem Summary-Flag versehen sind, was standardmäßig der Fall ist.

Gruß
Roland
Titel: Re: Attachment als Binary in Textfeld ablegen
Beitrag von: zysmo am 07.06.10 - 10:18:24
Bei Call object.ExtractFile("c:\tmp\") fehlt der Dateiname, probiers doch mal mit

Call object.ExtractFile("c:\tmp\" & object.Name).

Wenn ich die Hilfe zu Get richtig verstanden habe, passt die Declaration Dim tempimage As Variant nicht, das muss wohl etwas konkreter sein.

Call object.ExtractFile("c:\tmp\" & object.Name) funktioniert  :)
Komischerweise hatte ich vorher Call object.ExtractFile("c:\tmp\tempimage.bmp") versucht, das hatte nicht funktioniert.... ???
Aber egal. Geht ja jetzt...

Wie muss die Deklaration von tmpimage dann aussehen? Ich hatte die Hilfe so verstanden, dass Variant da passt...
Ich habe damit ja ein Bild einzulesen das zwischen 5 und 15k gross ist..
Muss ich dann ein Byte *15000 deklarieren?


Gruß
Alex
Titel: Re: Attachment als Binary in Textfeld ablegen
Beitrag von: zysmo am 08.06.10 - 10:18:22
OK. Ich hab es jetzt etwas anders gemacht...

Ich belasse das Bild im Dateisystem und hole mir sie dann erst beim Schreiben in die Datenbank.
Dafür schreibe ich sie dann so in einen Buffer:
Code
Dim ns As NotesStream
Set ns = session.CreateStream
If Not ns.Open("c:\tmp\" &doc.Firmenlogo(0), "binary") Then
	Call rt.AppendText("Öffnen der Datei - " &doc.Firmenlogo(0) & " - fehlgeschlagen")
	Call rt.AddNewline(1,True)	
	Goto theend
End If

buffer = ns.Read()
Call ns.Close

Der buffer wird auch befüllt, aber wenn ich in in meinem sql-statement unterbringen will, bekomme ich als Fehler 'Falscher Datentyp'... >:(
In etwa so:
Code
qry.SQL = "INSERT INTO xxx (spalte1, spalte2) VALUES (doc.feldwert(0), buffer)

Ich mein iss ja auch klar, weil er einen String erwartet....
Aber wie geht es richtig  ???

Titel: Re: Attachment als Binary in Textfeld ablegen
Beitrag von: umi am 08.06.10 - 16:53:33
Evtl. direkt per SQL statement. Hängt allerdings vom verwendeten SQL Server ab:
http://blogs.msdn.com/b/walzenbach/archive/2010/05/20/how-to-insert-binary-data-like-images-documents-into-a-sql-server-database-with-sql-server-management-studio.aspx
Titel: Re: Attachment als Binary in Textfeld ablegen
Beitrag von: zysmo am 09.06.10 - 22:18:39
hmmm...
Per SQL-Statement ist klar... aber wie bekomm ich das in LS verpackt....??

Ich habe jetzt mit ns.ReadText(), statt ns.Read() rumgespielt.
Das liefert mir eine String zurück. Bei Textdateien funktioniert das auch wunderbar, bei Binärfiles scheint aber das Problem zu sein, dass bestimmte Sonderzeichen zum Abbruch des Strings führen  >:(
Ich bekomme in meiner Variable nämlich immer nur Fragmente und nicht das komplette Binary des Bildes....

Ich denke ich muss mich nach einer Alternative (außerhalb von Lotus) umschauen  :-[
Falls jemand aber noch eine Idee hat, immer her damit  ;)


Gruß
Alex