2016-07-11 1 views
0

Я работаю с пространством имен Excel Interop, чтобы изменить строку соединения в подключениях рабочей книги Excel.Зачем устанавливать OLEDBConnection.Connection throws Exception (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

потому что '' Test Connection String "! = ConString.Replace (" Test Connection String "," New Test Connection String ")'? – 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 вместо этого, кажется, что изменение строки соединения через 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()); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^