【问题标题】:Why setting OLEDBConnection.Connection throws Exception (HRESULT: 0x800A03EC)?为什么设置 OLEDBConnection.Connection 会抛出异常(HRESULT:0x800A03EC)?
【发布时间】:2016-07-11 08:53:10
【问题描述】:

我正在使用 Excel 互操作命名空间来修改 Excel 工作簿连接中的连接字符串。

为什么当我尝试设置连接属性 (MSDN OLEDBConnection.Connection) 时会在分配的行上抛出错误?

HRESULT 异常:0x800A03EC

application = new Application();
Workbook wb = application.Workbooks.Open(file.FullName);
Sheets wbs = wb.Worksheets;
IEnumerable<Workbook> workbooks = application.Workbooks.Cast<Workbook>();

foreach (var connection in wb.Connections.Cast<WorkbookConnection>()
    .Where(c => c.Type == XlConnectionType.xlConnectionTypeOLEDB))
{
    connection.OLEDBConnection.Connection = "Test Connection String";
}

application.Quit();

但是,如下所示调用 Replace 方法是有效的。我发现这是一种解决方法,不确定为什么 Replace 在这种情况下有效。

application = new Application();
Workbook wb = application.Workbooks.Open(file.FullName);
Sheets wbs = wb.Worksheets;
IEnumerable<Workbook> workbooks = application.Workbooks.Cast<Workbook>();

foreach (var connection in wb.Connections.Cast<WorkbookConnection>()
    .Where(c => c.Type == XlConnectionType.xlConnectionTypeOLEDB))
{
    var conString = connection.OLEDBConnection.Connection.ToString();
    connection.OLEDBConnection.Connection = 
        conString.Replace("Test Connection String", "New Test Connection String");
}

application.Quit();

这实际上是我可以更改连接字符串的唯一方法,因此询问 set 可能引发错误的原因是什么。

【问题讨论】:

  • 因为"Test Connection String" != conString.Replace("Test Connection String", "New Test Connection String")?
  • 谢谢,让我停下来从头开始重新访问。将很快发布答案。不过会使用 OpenXML。

标签: c# excel connection-string office-interop


【解决方案1】:

可能有很多原因。共同点是向后兼容。 例如正在打开的 XLS 文件。

同时规范完整的文件路径 - 使用反斜杠。如果您确定不是在使用旧版 Excel 创建的文件,请将 DefaultSaveFormat 设置为 xlOpenXML 或“应用程序”上的类似内容。

您指定的代码的 COM 错误通常在无法解析对象名称(在工作簿中)或在解析此类名称时遇到任何其他问题时引发。

如果这些失败,请检查此链接:

http://www.hagrin.com/319/exception-hresult-0x800a03ec-excel-net-sql-and-windows-server-2008

【讨论】:

  • 想澄清一下,在实际保存文档之前,在分配的行上抛出了异常。在尝试保存文件时,形成我所理解的您提到的相关内容。它也是我使用的 *.xlsx 文件。
【解决方案2】:

我找到了一种使用 OpenXML 的方法,似乎通过互操作更改连接字符串并不是唯一的方法。

using (SpreadsheetDocument excelDoc = SpreadsheetDocument.Open(file.FullName, true))
{
    WorkbookPart workbookpart = excelDoc.WorkbookPart;
    ConnectionsPart connPart = workbookpart.ConnectionsPart;

    string spreadsheetmlNamespace = @"http://schemas.openxmlformats.org/spreadsheetml/2006/main";
    NameTable nt = new NameTable();
    XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
    nsManager.AddNamespace("sh", spreadsheetmlNamespace);

    XmlDocument xdoc = new XmlDocument(nt);
    xdoc.Load(connPart.GetStream());

    XmlNode oxmlNode = xdoc.SelectSingleNode("/sh:connections/sh:connection/sh:dbPr/@connection", nsManager);
    string newConnection = ReplaceInitialCatalog(oxmlNode.Value, repConfig.DbName);
    oxmlNode.Value = oxmlNode.Value.Replace(oxmlNode.Value, newConnection);

    //Truncates part with FeedData
    connPart.FeedData(connPart.GetStream());
    xdoc.Save(connPart.GetStream());
}

【讨论】:

    【解决方案3】:

    问题是连接字符串似乎有特殊前缀(OLEDB;),在分配时会检查它,因此可以通过以下方式解决:

    ...
    connection.OLEDBConnection.Connection = "OLEDB;Test Connection String";
    ...
    

    前缀在连接字符串检索时出现,因此是线索。

    虽然由于易于测试而推荐使用 OpenXML。

    【讨论】:

      猜你喜欢
      • 2015-05-08
      • 2011-03-02
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多