Excel anbinden.... - wiederkehrend Fehler "HRESULT: 0x80010105 (RPC_E_SERVERFAULT) question"

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    Excel anbinden.... - wiederkehrend Fehler "HRESULT: 0x80010105 (RPC_E_SERVERFAULT) question"

    Moin!

    ich habe folgende Funktion bei mir um auf Excel zugreifen zu können:

    Visual Basic-Quellcode

    1. ''' <summary>
    2. ''' Öffnen der Excel-Tabelle
    3. ''' </summary>
    4. ''' <returns>1... erfolgreich / 0 ... fehlgeschlagen / -1 ... Datei nicht gefunden</returns>
    5. Private Function OpenExcel() As Integer
    6. Dim Status As Integer = 0
    7. Try
    8. _eApp.Visible = False
    9. If System.IO.File.Exists(_LayerKonvertFilename) = False Then
    10. MsgBox("Kann Layerkonvertierungsdatei nicht finden!" & vbCrLf & _LayerKonvertFilename, MsgBoxStyle.Critical, k_AppName)
    11. Return -1
    12. End If
    13. _eApp.Workbooks.Open(_LayerKonvertFilename, [ReadOnly]:=True)
    14. _exDok = CType(_eApp.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet)
    15. Status = 1
    16. Catch ex As Exception
    17. _TryReport.Show("unerwarteter Fehler in EBL_FDOExport > Export_Layer > OpenExcel", ex.ToString)
    18. Return 0
    19. End Try
    20. Return Status
    21. End Function


    Zeitweilig bekomme ich immer wieder folgende Fehlermeldung:

    HRESULT: 0x80010105 (RPC_E_SERVERFAULT) question


    ... und dann funktioniert es wieder. Die Exceldatei liegt auf einem Server und ist nicht geöffnet.

    Im Web habe ich unter anderem dieses gefunden stackoverflow.com/questions/97…pc-e-serverfault-question und danach kann das irgendetwas mit ActiveX zu tun haben und dortigen Problemen.

    Gibt es einen "betriebssicheren" Weg?

    Gruß Jan
    Hi @jan99!

    jan99 schrieb:

    folgende Fehlermeldung
    WIE erscheint dir diese Fehlermeldung? Kommt da, obwohl du Try Catch verwendest ein Exception-Fenster oder bekommst du die, wenn du das Try Catch debuggst und auf ex gehst und die die Details ansiehst?

    Zu deiner Frage:

    jan99 schrieb:

    Gibt es einen "betriebssicheren" Weg?
    Ich gehe mal davon aus, dass du erreichen willst, dass egal unter welchen Umständen, das Programm IMMER funzt und es keine Fehlermeldung gibt ->Wunschdenken.

    Ok, Spaß beseite. DAs Problem was du hier hast, ist - jenachdem - entweder eine "Race Condition" oder ein Verfügbarkeitsproblem. Sprich: Wenn die Excel auf dem Server liegt, auf den 10 Leute Zugriff haben, kannst du NIE sicher sein, dass nicht vielleicht doch irgendwer oder irgendetwas (ein Antivierenprozess) darauf zugreift. Mit Verfügbarkeitsproblem mein ich, dass du als Anwendungsentwickler nicht garantieren kannst, dass deine Anwendung fehlerfrei auf die Datei zugreifen kann.

    Klar kann sagen: Und was ist, wenn ich eine einfach Text-Datei aufmachen will? Das geht doch. Das schon, nur Excel kannst du nur durch Interop ansprechen. Also über COM Schnittstellen - und die sind alles anders, als robust gegenüber falscher Bedienung. Da kann es schon mal vorkommen, dass ein falsches Öffnen oder eine nicht richtig übertragene Datei zum Abbruch führt und du fragst dich was die Fehlermeldung heißen soll.
    Da die Fehlermeldung sich auf einen MS Server bezieht - jedenfalls scheint mir das nach 5 Minunten recherche dieses Fehlercodes - würde ich dir vorschlagen, speichere dir doch die Datei einfach vom Server auf deinem lokalen Rechner und öffne sie dann noch mal mit deinem Code. Vielleicht geht es ja dann ;D


    Und jetzt noch was, was mir am Herzen liegt:

    jan99 schrieb:

    System.IO.
    Mach doch ein Imports System.IO, dann brauchst du das nicht davor schreiben.

    jan99 schrieb:

    Exists(_LayerKonvertFilename) = False
    Ist unnötig. Mach einfach ein If Not (File.Exists(_LayerKonvertFilename)) Then und fertig. Was du hier machst, ist: Du prüfst in dem If, ob die Bedingung, dass eine Funktion den Wert [tt]False liefert, True ist. Kompliziert, ne? Eben. Deswegen einfach ein Not davor, dann ist das einfacher ;D

    jan99 schrieb:

    MsgBox
    MsgBox ist noch aus dem alten VB6 Standard. Mach besser MessageBox.Show. MessageBox ist eine Klasse aus dem Namspace System.Windows.Forms

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    jan99 schrieb:

    HRESULT: 0x80010105 (RPC_E_SERVERFAULT)
    Mit dieser Fragestellung an Frau Google bekommst Du schon mal eine Reihe Hinweise, was das sein könnte.
    Blätter das mal durch und vergleiche die dort genannten Rahmenbedingungen mit Deinen. Vielleicht findest Du da was.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn du die Daten aus Excel nur lesen/weiterverarbeiten willst, kannst du drauf zugreifen wie auf ne DB. Gibts nen Connectionstring für.

    Edit: Beispiel in C#


    using System;
    using System.Data;
    using System.Windows.Forms;
    using System.Data.OleDb;
    namespace Übersetzungstool
    {
    class ExcelService
    {
    public DataTable dtFromExcel(string sPfad)
    {
    string sSheetToImport = "NameTabellenblatt";
    string sStatement = "SELECT * FROM [" + sSheetToImport + "$]";
    DataTable dtUebersetzungen = new DataTable();
    dtUebersetzungen.TableName = "Uebersetzungen";
    OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + sPfad + "; Extended Properties= Excel 8.0;");
    OleDbDataAdapter adapter = new OleDbDataAdapter(sStatement, con);
    try
    {
    adapter.Fill(dtUebersetzungen);
    }
    catch(Exception ex)
    {
    MessageBox.Show("Fehler: "+ ex.Message);
    return null;
    }
    return dtUebersetzungen;
    }
    }
    }
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen