Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Exceldokument in die DB exportieren mit binary

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von wydyCH, 20 Juni 2013.

  1. wydyCH

    wydyCH Neuer Benutzer

    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?
     
  2. wydyCH

    wydyCH Neuer Benutzer

    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)'))
    )
     
  3. ukulele

    ukulele Datenbank-Guru

    Haste das auch mal mit so richtig großen Brummern probiert? Nicht das bei 100k Zeichen schluss ist oder so.
     
  4. wydyCH

    wydyCH Neuer Benutzer

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden