Exceldokument in die DB exportieren mit binary

wydyCH

Neuer Benutzer
Beiträge
3
Moin,
ich versuche zurzeit ein Exceldokument in die DB zu speichern. In der DB hat es die Tabelle doks mit den Spalten dok_id(PK) und dok_image(image, null).
Als erstes habe ich mit
SELECT BulkColumn
FROM OPENROWSET( BULK 'C:\test.xls',
SINGLE_BLOB) as ExternalFile

versucht es in die DB zu schreiben. Lokal hat das ganze funktioniert, aber der updater bei den Kunden meldet, er hätte keine Berechtigung für BULK. Jetzt kann ich natürlich bei unseren ganzen Kunden nicht von Hand die Berechtigung für BULK ändern/den Updater Benutzer anpassen. Der Aufwand wäre zu gross.
Also dachte ich mir: Wieso nehme ich nicht direkt die aus BULK generierten Binärdaten und schreibe die mit INSERT in die DB. Das Resultat dabei war, dass zwar Daten in das Excel geschrieben wurden, aber diese recht kryptisch aussehen. Hier ein Beispiel vom Insert:
insert into dok(dok_id, dok_image)values('8CDA1EFB-733A-425E-90A6-BF492937B740',0xD0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF09000600000000000..)
(Der binäre String ist über 40k Zeichen gross)
Das Exceldokument hat folgendes Aussehen danach:
ñ
®à0ïð``0ïÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿòP0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@ïÿÿóÐ0€@ °ÀÐàð 0ïÿÿóP`p€ °Ààð€ @pP`p` °ÀÐàð 0@P€ïÿÿÿïÿÿõïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ ðð@Pà@ `Pÿÿÿÿÿÿÿð € `
À=ûçRüà°<ì–Ìàp0pð ° ðð° pÿÿÿÿÿÿÿð @ð` ð ð P0@ð0P  P0 ŸK


†Œà?«
......

Wo liegt das Problem? Ist der binäre String zu gross? Ist es auf diese Weise gar nicht möglich? Gibt es eine alternative Möglichkeit das Problem zu lösen?
 
Werbung:

wydyCH

Neuer Benutzer
Beiträge
3
So ich hab es jetzt nach langem hin und her geschafft.
Anstatt dass ich direkt das binary in die DB schreibe, erstelle ich aus dem Excel ein base64.
Dieses Base 64 kann ich dann auf image casten und so in die DB schreiben.
Hier wird erklärt wie es funktioniert: www.codemeit.com/sql/sql-2005-base64-decode-query-syntax.html
und hier kann man aus einer Datei ein base64 generieren: www.motobit.com/util/base64-decoder-encoder. asp
Schlussendlich sieht es so aus:
-- Code
--Muss on sein sonst bricht das Script ab
SET ANSI_WARNINGS ON

--base64 Daten vom Excel
DECLARE @data varchar(max), @XmlData xml
SET @data = '...'

-- Erstellt XML aus data
SET @XmlData = CAST('<data>' + @data + '</data>' as xml)

insert into dokument_image_dki
(dok_id, dok_image)
values('25BC4567-F12E-4C0F-B5A8-15A6C0CDAE05'
, CONVERT(image, @XmlData.value('(data)[1]', 'varbinary(max)'))
)
 
Werbung:

wydyCH

Neuer Benutzer
Beiträge
3
Haste das auch mal mit so richtig großen Brummern probiert? Nicht das bei 100k Zeichen schluss ist oder so.

Nein brauch ich eigentlich auch nicht. Wir haben nur Vorlagen in der DB, diese sind aber normalerweise nicht sehr gross.
Da es mit varbinary(max)/varchar max funktioniert würde ich aber denken dass nach 2^31-1 Byte (2 GB) Zeichen Schluss ist. Müsste man aber ausprobieren.
 
Oben