2016-07-11 102 views
0

我正在使用Excel Interop名称空间来修改Excel工作簿连接中的连接字符串。为什么设置OLEDBConnection.Connection抛出异常(HRESULT:0x800A03EC)?

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

这其实是我能得到的连接字符串改变的唯一途径,因此要求背后是什么,为什么一套可能引发错误的原因。

+1

因为''测试连接字符串“!= conString.Replace(”测试连接字符串“,”新测试连接字符串“)? – Slai

+0

谢谢,让我停下来,重新从头开始访问。很快会发布答案。尽管会使用OpenXML。 –

回答

0

问题是连接字符串似乎有特殊的前缀(OLEDB;),这是在分配选中状态,以便它可以通过这个来解决:

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

前缀在连接字符串检索显示了它的脸,因此是线索。

虽然推荐使用OpenXML,但易于测试。

0

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

还标准化完整的文件路径 - 使用反斜杠。设置DefaultSaveFormat到xlOpenXML或“应用”,如果你确信你是不是在与旧版本的Excel中创建的文件操作类似。

与你指定的代码,当它不能解析的对象名称通常引发的COM错误 - 在工作簿中 - 或者它有这样的名字的分辨率任何其他问题。

如果失败,检查此链接:

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

+0

想要澄清的是,在文档的实际保存之前,在作业的一行中会引发异常。形成我所了解的事情你提到的是相关的当试图保存文件。它也是我使用的* .xlsx文件。 –

0

我找到了一种方法来使用的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()); 
} 
相关问题