我正在使用Excel Interop命名空间修改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方法是有效的。我发现这是一种解决方法,不确定为什么在这种情况下替换有效。
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可能抛出错误的原因是什么。
答案 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。