2016-07-11 103 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()); 
} 
相關問題