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

SharePoint中GetDataTable返回null,列表项计数显示为2

SharePoint GetDataTable返回Null的排查与解决

咱们先梳理下你的问题:列表总共有2个项,但执行SPQuery后调用GetDataTable()返回了null。结合你的代码,我帮你找出几个关键问题和修复方案:

1. SPQuery的XML查询语法错误

你的Where条件里的XML结构有问题:<Or>标签只包含了一个<Eq>条件,这不符合SharePoint CAML查询的规则——And/Or必须包含两个子条件。而且整个Where节点下只能有一个根逻辑节点,你当前的写法是<And>...</And><Or>...</Or>,这会导致查询解析失败,返回空结果,进而GetDataTable()返回null。

假设你的业务逻辑是:(推荐人是当前用户 且 状态为变更请求)OR(分配给当前用户),那正确的CAML结构应该是嵌套的Or包含And和另一个Eq:

<Where>
  <Or>
    <And>
      <Eq>
        <FieldRef Name='RecommendBy_EmpCode' />
        <Value Type='Text'>[当前用户编码]</Value>
      </Eq>
      <Eq>
        <FieldRef Name='Status' />
        <Value Type='Text'>ChangeRquest</Value>
      </Eq>
    </And>
    <Eq>
      <FieldRef Name='assign_to_EmpCode' />
      <Value Type='Text'>[当前用户编码]</Value>
    </Eq>
  </Or>
</Where>

2. ViewFields字段名称大小写不匹配

你在ViewFields里写的是<FieldRef Name='STATUS' />,但在Query里用的是Status——SharePoint的字段内部名称是大小写敏感的,这会导致字段无法被正确检索,可能影响DataTable的生成。要统一写成和列表字段内部名称一致的大小写(通常是Status这种驼峰/Pascal命名)。

3. 先确认查询实际返回的项数

你现在打印的是list.Items.Count(列表总项数),但这和SPQuery过滤后的结果无关。建议你添加代码打印r.Count,看看查询到底返回了多少项:

var r = list.GetItems(q);
lblTEst.Text = $"总项数:{list.Items.Count} | 查询返回项数:{r.Count}"; // 新增这行

如果r.Count是0,那说明查询条件没匹配到任何项,GetDataTable()自然会返回null。

修正后的完整代码示例

public DataTable GetInbox() 
{ 
    using (SPSite site = new SPSite(SPContext.Current.Web.Url)) 
    { 
        using (SPWeb web = site.OpenWeb()) 
        { 
            SPList list = web.Lists.TryGetList("PromotionRecommendationList");
            if (list == null)
            {
                // 先判断列表是否存在,避免空引用异常
                return null;
            }

            string currentEmpCode = obj_vemployee.GetEmployeeCode(GetLoggingName(CurrentUser.LoginName));
            var q = new SPQuery() 
            { 
                Query = $@"
                <Where>
                  <Or>
                    <And>
                      <Eq>
                        <FieldRef Name='RecommendBy_EmpCode' />
                        <Value Type='Text'>{currentEmpCode}</Value>
                      </Eq>
                      <Eq>
                        <FieldRef Name='Status' />
                        <Value Type='Text'>{Status.ChangeRquest}</Value>
                      </Eq>
                    </And>
                    <Eq>
                      <FieldRef Name='assign_to_EmpCode' />
                      <Value Type='Text'>{currentEmpCode}</Value>
                    </Eq>
                  </Or>
                </Where>",
                ViewFields = @" 
                <FieldRef Name='Request_No' /> 
                <FieldRef Name='RecommendBy_EmpCode' /> 
                <FieldRef Name='RecommendTo_EmpCode' /> 
                <FieldRef Name='Status' /> 
                <FieldRef Name='RequestStatus' /> "
            }; 

            var r = list.GetItems(q);
            lblTEst.Text = $"总项数:{list.Items.Count} | 查询返回项数:{r.Count}";
            
            if (r.Count == 0)
            {
                // 如果没有查询到项,返回空DataTable替代null,避免上层逻辑报错
                return new DataTable();
            }
            
            DataTable dtResults = r.GetDataTable();
            return dtResults; 
        } 
    } 
    return null; 
}

额外调试建议

  • 可以用U2U CAML Query Builder这类工具可视化验证你的CAML语法,避免手动写XML出错。
  • 检查currentEmpCode是否正确获取到了当前用户的编码,确保和列表中存储的格式完全一致(比如是否有空格、大小写差异)。

内容的提问来源于stack exchange,提问作者Alina Anjum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:52