SharePoint中GetDataTable返回null,列表项计数显示为2
咱们先梳理下你的问题:列表总共有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
相关产品推荐
相关产品推荐

