OleDbConnectionStringBuilder, возвращающее значение, несовместимое с OleDbConnection
Мы столкнулись с неожиданным исключением, возникшим при открытии OleDbConnection
созданный из возвращаемого значения OleDbConnectionStringBuilder.ConnectionString
имущество. Использовали OleDbConnectionStringBuilder
обновить любого родственника DataSource
пути к абсолютным путям.
Мы получаем System.Data.OleDb.OleDbException
Исключение, когда мы называем OleDbConnection.Open
и сообщение гласит:
"Формат строки инициализации не соответствует спецификации OLE DB".,
Код является:
var oleDBbuilder = new OleDbConnectionStringBuilder(connectString);
oleDBbuilder.DataSource = ResolveDataSourcePath(oleDBbuilder.DataSource);
m_pOleDb = new OleDbConnection(oleDBbuilder.ConnectionString);
m_pOleDb.Open(); // <-- Throws exception here
У нас не было проблем с этим, пока мы не попытались обработать строку подключения, которая содержала значение Mode=ReadWrite|Share Deny None;
, Значение, возвращаемое OleDbConnectionStringBuilder.ConnectionString
свойство возвращает свойство с указанным значением. например:
Эта строка подключения (переменная 'connectString'):
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\SomePath\@Some Database.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False
становится (OleDbConnectionStringBuilder.ConnectionString):
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\SomePath\Some Database.mdb";Persist Security Info=False;Mode="ReadWrite|Share Deny None"
Mode
значение без кавычек работает без ошибок!
У меня есть пара вопросов:
- Это по замыслу? Почему он возвращает несовместимое значение?
- Как я могу обойти это, не дублируя работу
OleDbConnectionStringBuilder
?
0 ответов
У меня нет настоящего ответа, просто работа.
Перед использованием oleDBbuilder.ConnectionString вы можете удалить кавычки с помощью такого регулярного выражения:
m_pOleDb = new OleDbConnection(Regex.Replace(oleDBbuilder.ConnectionString, @"(?<=mode=)((?<quote>""|')?(?<inner>[^;]+?)\k<quote>)", "${inner}", RegexOptions.IgnoreCase));
вместо того
m_pOleDb = new OleDbConnection(oleDBbuilder.ConnectionString);
Другой вариант, если вы несете ответственность за исходную строку подключения, - это заменить пробелы в "Share Deny None" на заполнитель, например "Share###Deny###None", прежде чем передавать его в oleDBbuilder. В конце перед использованием oleDBbuilder.ConnectionString эту замену нужно снова отменить.
Чтобы ответить на ваш первый вопрос ("Это намеренно?") Я могу только предполагать. Для меня это больше похоже на небрежное программирование. Сетевые программисты проигнорировали тот факт, что ADODB.ConnectionModeEnum имеет своего рода атрибут flags, так что несколько значений могут быть добавлены с помощью Or.
редактировать
Во-первых: для меня это неправильное представление о цитировании ключей с пробелами внутри. Это необходимо только для ключей с начальными или конечными пробелами.
Во-вторых: я сделал несколько тестов. Это работает с Provider=VFPOLEDB.1 и Provider=Microsoft.ACE.OLEDB.12.0:
Mode=ReadWrite|Share Deny None
Mode=ReadWrite|"Share Deny None"
Это не работает:
Mode="ReadWrite|Share Deny None"
Mode="ReadWrite"|"Share Deny None"