#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 установлена папка, которая не существует.