为什么设置OLEDBConnection.Connection会抛出异常(HRESULT:0x800A03EC)?

时间:2016-07-11 08:53:10

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

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

enter image description here

为什么当我尝试设置连接属性(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方法是有效的。我发现这是一种解决方法,不确定为什么在这种情况下替换有效。

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可能抛出错误的原因是什么。

3 个答案:

答案 0 :(得分:0)

可能有很多原因。所有这些都是向后兼容的共同点。 比如打开XLS文件。

同样规范化整个文件路径 - 使用反斜杠。将DefaultSaveFormat设置为xlOpenXML或类似的&#39; application&#39;如果您确定不使用旧版Excel创建的文件。

如果无法解析对象名称(在工作簿中),或者在解决此类名称时遇到任何其他问题,则通常会抛出指定代码的COM错误。

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

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

答案 1 :(得分:0)

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

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());
}

答案 2 :(得分:0)

问题是连接字符串似乎有特殊的前缀(OLEDB;),在分配时检查它,这样可以解决:

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

前缀在连接字符串检索时显示其面,因此线索。

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