ACE.OLEDB.12.0连接SharePoint参数无效问题求助
首先得明确问题根源:Office 2016自带的ACE OLEDB驱动已经移除了对SharePoint WSS ISAM的支持,这就是为什么你用默认驱动不管是12.0还是16.0都报错,而单独安装的ACE 2010 x86能正常工作——因为ACE 12.0(对应2010版本)是最后一个保留WSS连接组件的ACE引擎版本。
下面给你几个可行的解决思路,按推荐优先级排序:
1. 绕过Office修复的ACE 2010静默安装(最快临时方案)
你遇到的“安装ACE 2010后打开Access触发修复”的问题,是因为常规安装会尝试替换Office 2016的组件。改用静默被动安装就能避免这个冲突:
- 下载Microsoft Access Database Engine 2010 x86安装包
- 打开命令提示符(以管理员身份运行),执行以下命令:
AccessDatabaseEngine.exe /quiet
这种安装方式不会覆盖现有Office组件,能同时保留Office 2016和ACE 2010引擎,修复后也不会再失效。
2. 改用SharePoint Client Object Model(CSOM)——推荐长期方案
ACE驱动的WSS支持已经被微软淘汰,更稳定可靠的方式是用官方推荐的CSOM来访问SharePoint列表,完全不需要依赖ACE驱动:
实现步骤:
- 在项目中安装NuGet包:如果是SharePoint 2013,安装
Microsoft.SharePoint.Client和Microsoft.SharePoint.Client.Runtime的15.0.0版本;如果是Online版本用Microsoft.SharePointOnline.CSOM。 - 示例代码(模拟你原来的DataSet输出逻辑):
using Microsoft.SharePoint.Client; using System.Data; // 替换为你的SharePoint站点URL和列表名称 string siteUrl = "http://你的SharePoint站点地址"; string targetListName = "YYY"; // 对应你之前的LIST参数值 using (ClientContext ctx = new ClientContext(siteUrl)) { // 如果需要域身份验证,添加凭据 // ctx.Credentials = new System.Net.NetworkCredential("用户名", "密码", "域名"); // 获取目标列表 List spList = ctx.Web.Lists.GetByTitle(targetListName); CamlQuery query = CamlQuery.CreateAllItemsQuery(); // 等同于SELECT * ListItemCollection items = spList.GetItems(query); // 加载数据到上下文 ctx.Load(items); ctx.ExecuteQuery(); // 转换为DataSet,和你原来的OLEDB逻辑对齐 DataSet ds = new DataSet(); DataTable dt = new DataTable(); // 添加列表字段作为DataTable列(跳过隐藏/只读字段) ctx.Load(spList.Fields, fields => fields.Where(f => !f.Hidden && !f.ReadOnlyField)); ctx.ExecuteQuery(); foreach (Field field in spList.Fields) { dt.Columns.Add(field.InternalName, typeof(string)); } // 填充行数据 foreach (ListItem item in items) { DataRow row = dt.NewRow(); foreach (DataColumn col in dt.Columns) { row[col.ColumnName] = item[col.ColumnName]?.ToString() ?? string.Empty; } dt.Rows.Add(row); } ds.Tables.Add(dt); // 后续可以像原来一样使用ds处理数据 }
这种方式不受Office版本限制,兼容性更强,也是微软目前主推的SharePoint数据访问方式。
3. 使用SharePoint ODBC驱动(备选方案)
如果坚持要用基于连接字符串的方式,可以试试SharePoint ODBC驱动:
- 下载32位的Microsoft SharePoint List ODBC Driver(匹配你的Office位数)
- 构建ODBC连接字符串示例:
Driver={Microsoft SharePoint List ODBC Driver};Server=http://你的SharePoint站点地址;Database=XXX;List=YYY;
然后用OdbcConnection替代OleDbConnection来执行查询,这样也能避开ACE驱动的兼容性问题。
最后再补充下你疑惑的点:Office 2016自带的ACE驱动虽然允许指定Provider=Microsoft.ACE.OLEDB.12.0,但实际上这个版本的驱动已经移除了WSS ISAM组件,只有单独安装的ACE 2010完整包才保留了这个功能,所以同一连接字符串在两种环境下表现不同。
内容的提问来源于stack exchange,提问作者banneh

