none
Kontext von Timer Threads RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein Programm, welches Daten aus einer Access DB ausließt. Das Öffnen der OdbcConnection erfolgt aus dem Kontext eines manuell erstellten Threads (d.h. var worker = new Thread(...) ).

    Tritt beim Zugriff auf die Datenquelle ein Problem auf, wird ein System.Threading.Timer erstellt, in dessen Thread-Prozedur versucht wird eine OdbcConnection zu öffnen. Dieser Versuch schlägt fehl und ich erhalte die Fehlermeldung:

    ---> System.Data.Odbc.OdbcException: ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver] Disk or network error.
    ERROR [01000] [Microsoft][ODBC Microsoft Access Driver]General Warning Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x4c8 Thread 0x12d0 DBC 0x26402c94 Jet'.
    ERROR [IM006] [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed ERROR [01000] [Microsoft][ODBC Microsoft Access Driver]General Warning Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x4c8 Thread 0x12d0 DBC 0x26402c94 Jet'.
    ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver] Disk or network error.
       at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
       at System.Data.Odbc.OdbcConnectionHandle..ctor(OdbcConnection connection, OdbcConnectionString constr, OdbcEnvironmentHandle environmentHandle)
       at System.Data.Odbc.OdbcConnectionOpen..ctor(OdbcConnection outerConnection, OdbcConnectionString connectionOptions)
       at System.Data.Odbc.OdbcConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

       at System.Data.Odbc.OdbcConnection.Open()

    Ist der System.Threading.Timer ThreadPool Thread in seinen Berechtigungen beschnitten (vgl. Warning unable to open registry key)?

    Danke und viele Grüße,
    Christian

    Dienstag, 6. Mai 2014 14:27

Antworten

  • Hallo Christian,

    grundsätzlich "erben" Threads die Berechtigungen des Prozesses in denen sie gestartet werden.

    Hier dürfte das Problem am Alter des Jet Treibers liegen, der zu viele Berechtigungen benötigt - denn richtiger wären "flüchtige" Schlüssel in HKEY_CURRENT_USER aufgehoben.

    Für den HKLM\Software\ODBC Zweig hat ein "normaler" Benutzer keine Schreibrechte, und so schlägt das Erstellen des Schlüssels fehl.

    Da man den Treiber nicht ändern kann, bleibt nur die Berechtigungen zu ändern wie es im KB Artikel 295297 beschrieben wird:

    PRB: Error Message: 0x80004005: General Error Unable to Open Registry Key

    Gruß Elmar

    Mittwoch, 7. Mai 2014 09:57
    Beantworter

Alle Antworten

  • Hi Christian,
    es wird die Jet genutzt, die nur im 32-Bit-Modus arbeiten kann. Hast Du das in Deinem Programm berücksichtigt?

    --
    Peter

    Dienstag, 6. Mai 2014 19:00
  • Hallo Peter,

    vielen Dank für Deine Hilfe!

    Der Prozess ist x86 (32-Bit) kompiliert. Das Öffnen der OdbcConnection funktioniert, wenn diese im Kontext eines manuell erstellen Threads geöffnet wird.

    Im Kontext des Timer Threads kommt es zu der oben genannten Ausnahme.

    Lediglich der Threadkontext ist unterschiedlich.

    Ich frage, da ich aufgrund der Beschreibung

    Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x4c8 Thread 0x12d0 DBC 0x26402c94 Jet'

    den Verdacht habe, dass der Timer Thread im Gegensatz zu einem normalen Thread nicht über die benötigten Rechte verfügt.

    Hast Du eine Idee?

    Vielen Dank und viele Grüße,
    Christian


    Mittwoch, 7. Mai 2014 06:55
  • Hallo Christian,

    grundsätzlich "erben" Threads die Berechtigungen des Prozesses in denen sie gestartet werden.

    Hier dürfte das Problem am Alter des Jet Treibers liegen, der zu viele Berechtigungen benötigt - denn richtiger wären "flüchtige" Schlüssel in HKEY_CURRENT_USER aufgehoben.

    Für den HKLM\Software\ODBC Zweig hat ein "normaler" Benutzer keine Schreibrechte, und so schlägt das Erstellen des Schlüssels fehl.

    Da man den Treiber nicht ändern kann, bleibt nur die Berechtigungen zu ändern wie es im KB Artikel 295297 beschrieben wird:

    PRB: Error Message: 0x80004005: General Error Unable to Open Registry Key

    Gruß Elmar

    Mittwoch, 7. Mai 2014 09:57
    Beantworter