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"
Другие вопросы по тегам