Laden...

[Erledigt] C# .Net - Zugriff auf OLE Word-Objekt aus Access Datenbank

Erstellt von Mobile4Bizz vor 7 Jahren Letzter Beitrag vor 7 Jahren 5.315 Views
M
Mobile4Bizz Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren
[Erledigt] C# .Net - Zugriff auf OLE Word-Objekt aus Access Datenbank

Visual Studio 2015
C# .Net
Access MDB Datenbank

Salve!

Folgendes Szenario. C# Windows Form Anwendung inklusive einer Access MDB Projektdatenbank. Keine Chance das zu ändern - Kunde hat die MDB und will die MDB behalten. Anwender geben Datensätze ein und hinterlegen in einer OLE Objekt Spalte als Anhang ein Word Dokument (DOCX).

Meine Aufgabe. Datensatz wird ausgewählt. Und auf Wunsch wird das Word Dokument(welches ja als OLE Objekt eingefügt wurde) geöffnet. Soweit der Wunsch.

Mein Code müsste also "nur" bei dem ausgewählten Datensatz den OLE "Anhang" öffnen. Das kann doch nicht so schwer sein 😄 ... aber anscheinend doch. ich experimentiere bereits seit 2 Tagen herum, durchforste das Web. Es gibt zig Lösungen - wenn in der MDB Tabelle / Spalte ein Image als OLE abgelegt wurde. Das ist gar kein Problem - 100 Beispiele wie man die Daten in einer PictureBox ablegt... aber Word? Nichts!

Nochmals. Will die Word Datei ja nicht mal wo übertragen. Ich möchte lediglich das OLE Objekt öffnen (was dann ja automatisch durch Word erfolgt).

Mein bisheriger Code - geht aber natürlich nicht:


            string strSQL = "SELECT Anhang FROM tbl_inhalte WHERE ID=1";
            OleDbCommand cmd = new OleDbCommand(strSQL, con);

            var oleBytes = (Byte[])cmd.ExecuteScalar();
            const int offset = 85;

            MemoryStream ms = new MemoryStream();
            ms.Write(oleBytes, offset, oleBytes.Length - offset);
            ms.Flush();

            Word.Application newWordApp = new Word.Application();
            newWordApp.Visible = true;
            Word.Document newWordDoc = newWordApp.Documents.Open(ms);

Für Hilfestellung wäre ich sehr dankbar!

Grüße Jörg

16.842 Beiträge seit 2008
vor 7 Jahren

Was ist denn genau das Problem?
"Geht nicht" hilft keinem 😉

M
Mobile4Bizz Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

Das sollte man eigentlich oben heraus lesen (können) ... 😉

Ich schaffe es nicht mittels C# die Word Datei (welche als OLE Objekt in der Spalte Anhang sich befindet) zu öffnen. Mein Code funktioniert so nicht. Es tut sich gar nichts. Ich habe den o.g. Code übernommen von Beispielen mit Bildern, habe auch bisschen herum gespielt - aber nochmals - es klappt nicht (das öffnen der Word Datei).

Ich möchte "nur" die Word Datei öffnen...
Aber das klappt mit meinem Code nicht. Und im Web suche ich bereits seit 2 Tagen. Finde aber keine Beispiel. Daher bräuchte ich Hilfe...

16.842 Beiträge seit 2008
vor 7 Jahren

Was geht denn nicht? Geht es logisch nicht oder kompiliert Dein Quellcode nicht?

Was ich hier erkenne oder rate ist, dass Du versuchst ein Word-Dokument aus einem Stream zu öffnen.
Mir wäre völlig neu, dass Word das könnte. Und bei einem Blick in die Doku sehe ich auch absolut keine Methode, die bei Open() einen Stream als Parameter akzeptieren würde.
Aber vielleicht geht das doch irgendwie und ich seh es hier in der Doku nur nicht....

Da das für mich hier reines raten ist, was genau denn das Problem ist, kann zumindest ich auch nicht helfen.
Vielleicht hat jemand anderes hier mehr (intuitives) Verständnis.

5.658 Beiträge seit 2006
vor 7 Jahren

Hi Mobile4Bizz,

daß du für dein spezielles Problem eine Lösung finden wirst, die du nur per Copy & Paste einfügen mußt, ist relativ unwahrscheinlich.

Verwende doch mal den Debugger um herauszufinden, welches Ergebnis die Datenbankabfrage zurückgibt, und ob du Word überhaupt per Interop mit einer vorhandenen Datei öffnen kannst usw.: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Und
How to: Programmatically Open Existing Documents

Weeks of programming can save you hours of planning

M
Mobile4Bizz Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

Geht logisch nicht.
Die letzte Code Zeile wirft einen "unbekannten" Fehler.

Schau nochmals 😃 ... ich habe eine Access MDB im Projekt, welche eine OLE Spalte hat. In dieser Spalte sind Word Dokumente abgelegt - eben als OLE Dokument. Und ich will jetzt auf einen Datensatz zu greifen und dessen OLE Spalte - und eben abgelegte Word Datei öffnen. Also den "Anhang" sozusagen öffnen.

Das geht mit abgelegten OLE Bildern:
https://social.msdn.microsoft.com/Forums/en-US/f716de15-b9f2-49a0-8ae8-624a190454de/extracting-ole-object-from-ms-access?forum=adodotnetdataproviders

In dem Beispiel wird ein OLE Image eingelesen und in eine PictureBox übergeben. Davon findet man hunderte Beispiele. Es gibt auch Beispiele wie man ein PDF, welches als OLE abgelegt wurde, öffnet. Aber all diese Beispiele gehen nicht mit einer Word Datei.

Mein Beispiel, das ich oben gepostet habe ist ein VERSUCH die vorhandenen Beispiele für Images, PDF so um zu bauen, dass meine Word Datei geöffnet wird. Aber wie geschrieben - die Word Datei öffnet sich nicht, die letzte Zeile wirft einen Fehler.

Es kann also sein, dass mein Beispiel komplett falsch ist. Oder nur zur Hälfte stimmt. Aber irgendwie muss es doch möglich sein, das eingebettete Word OLE Objekt aus der Access DB zu öffnen. Nur wie?

War das verständlicher?

---- Edit
Hätte ich eine ACDB Access und eine Spalte Anhang, welches ja im neuem Access Format gibt, wäre das Ganze übrigens gar kein Problem - wie man hier sieht: http://stackoverflow.com/questions/28786440/c-sharp-read-attachments-from-access-accdb

M
Mobile4Bizz Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

Ich komme der Sache näher...


            string strSQL = "SELECT Anhang FROM tbl_inhalte WHERE ID=1";
            OleDbCommand cmd = new OleDbCommand(strSQL, con);
            var oleBytes = (Byte[])cmd.ExecuteScalar();

            File.WriteAllBytes(@"c:\test\worddatei.docx", oleBytes.Skip(20).ToArray());

Die Word.DOCX Datei wird gespeichert.
Das Programm läuft ohne Fehler durch.

Wenn ich nun im entsprechenden Pfad die Word Datei selber öffne - öffnet sich Word, dann kommt eine Fehlermeldung, dass es nicht lesbare Elemente gibt, danach bestätige ich das mit OK und die Word Datei ist mit komplettem Inhalt samt eingefügten Bildern offen.

Irgendetwas passt noch nicht ganz.
Aber ich finde nichts im Web - habe keine konkreten Anhaltspunkte. Ideal wäre natürlich jemand, der so etwas schon mal gemacht hat.

16.842 Beiträge seit 2008
vor 7 Jahren

Ne ehrlich gesagt wird es nicht klarer.

Die letzte Code Zeile wirft einen "unbekannten" Fehler.

Bitte les unsere Forenregeln, zB. bitte das Full Quoting unterlassen und Punkt 5 bezüglich der Fehlermeldung. [Hinweis] Wie poste ich richtig?
Poste die originale Fehlermeldung; ansonsten ist der Wiedererkennungswert eines "unbekannten Fehlers" leider gleich gegen 0.

Und zwischen "wirft einen Fehler" und "erzeugt einen Compiler-Fehler" liegen leider Welten.
Zur Not mach ein Screenshot, damit die Leute Dir annähernd folgen können, was das Problem ist.
Machs potentiellen Helfern so verständlich und leicht wie möglich; dann bekommt man erfahrungsgemäß auch entsprechend bessere antworten.

Wenn es nun einen Fehler beim Öffnen - ich nehme an, dass ich richtig lag mit dem Öffnen-aus-Bytes - aus der Datei nun einen Fehler gibt, dann liegts vermutlich daran, wie Du die Bytes schreibst.
Das hier kann Dir aber niemand aus der Ferne genau sagen; dafür musst Du den Code debuggen und im Prinzip schauen ob die Bytes, die Du schreibst, das enthalten, was sie enthalten sollen.
Wir kennen hier natürlich auch nicht den Ursprung der Bytes. Ich hab das schon einige Male gemacht aber mit den Informationen muss man sich das leider aus den Fingern saugen....

Warum Du hier 20 Bytes beim Schreiben überspringst; das weisst leider auch nur Du 😉
Und sicher, dass sich hinter den Bytes eine *.docx und nicht nur eine *.doc befindet?

*.docx ist ja nur eine ZIP Datei.
Nenn diese also in *.zip. Wenn Du sie mit einem ZIP-Programm öffnen kannst, dann stimmt mit hoher Wahrscheinlichkeit wenigstens das Byte-Array.
Wenn nicht, dann ist das Dein Problem (oder es ist eben kein docx).

M
Mobile4Bizz Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

Kein Problem - Screenshots mache ich heute Abend.

Aber Du bringst mich auf einen weiteren Lösungsansatz! Die 20Byte werden beim Öffnen von Images genommen (Microsoft Quelle). Bei .Doc Dateien sind es 85 (ich habe halt 20 und 85 ausprobiert). Aber MS schreibt, 85 bei DOC Dateien - und Du hast recht - es sind ja ZIP Dateien die DOCX..!

Die Word Datei wird beim Kunde von den Anwender direkt in Access als OLE Objekt in der Access Applikation über ein Access Formular als OLE Objekt eingefügt.

Meine (SEPERATE) Windows GUI C# Anwendung "darf" nun einen bestimmten Datensatz suchen und von diesem Datensatz dann das vorher von den Anwender beigefügte Word OLE Objekt öffnen. Das ist die Aufgabe meines C# Codes.

Und das wird das Problem sein. DOCX und DOC.

Ich werde heute Abend dem Access DB Datensatz mal eine Word .doc Datei als OLE einfügen (speichern) und dann mit meinem Code Beispiel es nochmals probieren (mit den von MS empfohlenen 85Byte).

Danke nochmals.

D
985 Beiträge seit 2014
vor 7 Jahren
D
152 Beiträge seit 2013
vor 7 Jahren

Ist ewig her das ich was mit OLE und Acces zu tun hatte.
Soweit ich weiß haben die Access OLE Objekte einen Header in dem die Information stehen.
Und dieser muss halt weg, wenn die Datei "normal" geöffnet werden soll.

Vielleicht hilft der folgende Link weiter
https://social.msdn.microsoft.com/Forums/de-DE/78531493-bb12-457c-9aba-e74f10ac7b44/oleobjekte-aus-einer-access-2003tabelle-per-vba-in-word-ffnen-und-bearbeiten?forum=accessde

M
Mobile4Bizz Themenstarter:in
7 Beiträge seit 2016
vor 7 Jahren

Schau mal ob dir dieser Link weiterhilft

Danke, kannte ich schon - aber Danke! Da habe ich die Info mit den 85Byte her.

Und sicher, dass sich hinter den Bytes eine *.docx und nicht nur eine *.doc befindet?

Treffer 😄 ...! Das war es! Microsoft gibt die 85Byte für eine .DOC Datei an und eben nicht eine .DOCX Datei, welche ja "eigentlich" eine Zip ist. Das war der Fehler. Die Word Datei darf bei OLE in dem Fall eben nicht als DOCX abgespeichert werden. Die Anwender müssen eben eine DOC Word Datei speichern (was kein Problem ist für den Kunden).

Jetzt habe ich Testweise die Word Datei in Access als .DOC im OLE Feld abgespeichert - und siehe da - mein Programm kann die Word Datei lokal speichern und auch öffnen. Funktioniert 1a. Danke nochmals für den "Denkanstoß".


Falls jemand über C# ein Word OLE Objekt (welches in Access eingebettet ist) öffnen möchte - und hier über Google und Co her findet.

  1. Muss eine .DOC Datei sein
  2. Der Code hier geht nun einwandfrei:

            string filePath = @"c:\test\worddatei.doc";
            string strSQL = "SELECT Anhang FROM tbl_inhalte WHERE ID=1";
            OleDbCommand cmd = new OleDbCommand(strSQL, con);
            var oleBytes = (Byte[])cmd.ExecuteScalar();

            File.WriteAllBytes(filePath, oleBytes.Skip(85).ToArray());


            Word.Application newWordApp = new Word.Application();
            newWordApp.Visible = true;
            Word.Document newWordDoc = newWordApp.Documents.Open(filePath);