Не удается открыть OleDbConnection к базе данных Jet после установки переменной окружения TMP в процессе

#c# #environment-variables #oledbconnection

#c# #переменные среды #oledbconnection

Вопрос:

Ранее в процессе я установил переменную окружения TMP в родственную папку, в которой находится база данных Jet. Я использую этот код:

 Environment.SetEnvironmentVariable("TMP", "<sibling to Jet database>");
  

Когда я вызываю OleDbConnection.Open() , я получаю сообщение об ошибке.
Вот трассировка стека:

 System.Data.OleDb.OleDbException (0x80004005): Unspecified error
   at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
   at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternalamp; connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OleDb.OleDbConnection.Open()  
  

Если я устанавливаю переменную окружения в командной строке перед запуском процесса вместо того, чтобы устанавливать ее в коде в процессе, я не получаю ошибку.

 set TMP=<sibling to Jet database>  
  

Вот моя строка подключения:

 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\<sibling to TMP>\database.mdb;
  

Я попытался создать образец консольного приложения, но оно не демонстрирует такое же поведение. Там это работает. Приложение, в котором я вижу ошибку, является приложением WinForms с целевой версией .NET Framework, установленной на .NET 4.6.1.

Папка, указанная в значении переменной окружения TMP, существует, и разрешения установлены на полный контроль для всех.

Даже если я установлю TMP в ту же папку в оболочке, что и в коде процесса, я все равно получаю ошибку. Если я устанавливаю какую-либо другую переменную окружения в коде в процессе, я не получаю ошибку.

Обновить:
Если я установлю переменную окружения TMP на уровне пользователя, я не вижу ошибки:

 Environment.SetEnvironmentVariable("TMP", "<sibling to Jet database>", EnvironmentVariableTarget.User);  
  

К сожалению, это не сработает для меня, поскольку я хочу, чтобы переменная окружения TMP изменялась только в рамках процесса и не влияла на другой процесс на компьютере.

Комментарии:

1. Jet поддерживает только Access 2003. Поэтому убедитесь, что база данных была сохранена в Access 2003, а не в новой версии access.

2. @jdweng, спасибо за комментарий. Однако база данных изначально создается из кода с использованием того же соединения, поэтому я знаю, что это правильная версия. Я не использую Access, а скорее поддержку Jet, встроенную в операционную систему Windows.

3. Это все еще файл MDB. Я бы открыл с помощью Access и посмотрел, исправен ли файл. Часто файлы сохраняются с неправильными расширениями, поэтому после записи вы не можете читать. Код c # видит файл с расширением mdb, а затем пытается прочитать как базу данных access.

4. @jdweng, на самом деле у меня даже не установлен Access на моем компьютере, но я знаю, что соединение работает, если я не устанавливаю переменную окружения TMP в процессе. Я могу открыть соединение и успешно выполнить запрос.

5. Существует ли папка на ПК? У вас есть разрешение на запись в папку?

Ответ №1:

Это ошибка, которую вы получите, если для переменной окружения TMP установлена папка, которая не существует.