2

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

在我们尝试处理包含 value 的连接字符串之前,我们对此没有任何问题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
4

1 回答 1

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 之前,必须再次撤消此替换。

要回答您的第一个问题(“这是设计使然吗?”),我只能推测。对我来说,它看起来更像是粗心的编程。NET 程序员忽略了 ADODB.ConnectionModeEnum 具有一种标志属性的事实,因此可以使用 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"
于 2020-07-27T07:48:04.033 回答