You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ACE.OLEDB.12.0连接SharePoint参数无效问题求助

解决方案:OLEDB连接SharePoint 2013列表的驱动兼容性问题

首先得明确问题根源: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驱动:

实现步骤:

  1. 在项目中安装NuGet包:如果是SharePoint 2013,安装Microsoft.SharePoint.Client和Microsoft.SharePoint.Client.Runtime的15.0.0版本;如果是Online版本用Microsoft.SharePointOnline.CSOM。
  2. 示例代码(模拟你原来的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:25:00