一个或多个字段类型未正确安装。前往列表设置页面以删除这些字段。

17
CamlQuery query = new CamlQuery();
query.ViewXml = @"<View>"
    + "<Query>"
    + "<Where><Eq><FieldRef Name='Name' /><Value Type='Text'>"
    + fileName
    + "</Value>"
    + "</Eq>"
    + "</Where>"
    + "</Query>"
    + "</View>";
ListItemCollection item = list.GetItems(query);
clientContext.Load(item);
clientContext.ExecuteQuery();

这个查询给我一个错误提示:一个或多个字段类型未正确安装。请前往列表设置页面删除这些字段。

如果我使用 <Where><Eq><FieldRef Name='Title' /><Value Type='Text'> 而不是 Name ,就可以了。

出了什么问题呢?列表里有 Name 这个字段啊。


@MarekKembrowski - > 内部名称是什么?抱歉,我对SharePoint还很陌生。 - kevin
19
简短来说,SharePoint 字段有两种名称 - 显示名称和内部名称。在某些地方(如 SPListItem[string fieldName])需要使用显示名称,在某些地方(如 SPQuery)需要使用内部名称。查看字段的内部名称最简单的方法是进入 SharePoint 网站上的字段定义,然后检查 URL 中的查询字符串。例如:http://localhost/_layouts/FldEdit.aspx?List={F8645DD3-CE80-4ECF-849F-6F851EECA2A7}&Field=LocalNumber,我的“本地号码”字段的内部名称为“LocalNumber”。 - Marek Kembrowski
那么当我们上传时,我们必须提供内部名称吗?还是由SharePoint自动创建? 感谢您的回答!! - kevin
1
“上传”是什么意思?当您创建新字段(列)时,SharePoint大多数情况下会自动创建内部名称。在某些情况下,您可以强制使用所选的内部名称(从xml创建字段时),但大多数情况下,您无法控制它。 - Marek Kembrowski
我是指当我们在SharePoint中保存文件时。那么查询列表中特定文档的最佳方式是什么?上述方法对我来说效果不佳。 感谢您的回答!!! - kevin
显示剩余4条评论
7个回答

19
如果您重命名一个已定义的列,则其内部名称不会更新。例如,您创建了一个自定义列表,默认情况下它有一个名为“标题”的列。如果您将该列更改为“用户ID”,则该列的内部名称仍为“标题”。

7

不确定这会解决那个错误信息,但以下是如何使用“名称”:

“名称”(用于开箱即用的文档库)的内部名称为“BaseName”

您可以使用PowerShell查找列表上所有列的内部名称:

$web = Get-SPWeb http://yoursiteurl
$web.lists["The List Name"].Fields | FL Title, InternalName

示例查询:

$query.set_innerXML("<Where><Eq><FieldRef Name='BaseName'></FieldRef><Value Type='Text'>" + $ItemName + "</Value></Eq></Where>")

Powershell中的完整示例:

function Update-SPItem($proxy, $ItemName, $listName, $lastModified, $firstName, $lastName, $chID, $emplNumber, )
{          
   $doc = New-Object System.Xml.XmlDocument
   $viewFields = $doc.CreateElement("ViewFields")
   $viewFields.set_innerXML("<FieldRef Name='ID'></FieldRef>")
   $queryOptions = $doc.CreateElement("QueryOptions")
   $queryOptions.set_innerXML("<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns><DateInUtc>FALSE</DateInUtc><ViewAttributes Scope='RecursiveAll'/>")
   $query = $doc.CreateElement("Query")
   $query.set_innerXML("<Where><Eq><FieldRef Name='BaseName'></FieldRef><Value Type='Text'>" + $ItemName + "</Value></Eq></Where>")
   $results = $proxy.GetListItems($listName, "", $query, $viewFields, "", $queryOptions, "")
   $rowXml = $results.GetElementsByTagName("z:row")
   $ItemID = $rowXml.Item(0).GetAttribute("ows_ID")

   # Update the item
   $batch = $doc.CreateElement("Batch")
   $batch.SetAttribute("OnError", "Continue")
   $batch.SetAttribute("ListVersion","1")
   $batch.SetAttribute("ViewName", "")
   $batch.InnerXml = "<Method ID='1' Cmd='Update'><Field Name='ID'>" + $ItemID + 
                     "</Field><Field Name='ImageCreateDate'>" + $lastModified + 
                     "</Field><Field Name='FirstName'>" + $firstName + 
                     "</Field><Field Name='LastName'>" + $lastName + 
                     "</Field><Field Name='CardHolderID'>" + $chID + 
                     "</Field><Field Name='EmployeeNumber'>" + $emplNumber + 
                     "</Field></Method>"

   $result = $proxy.UpdateListItems($listName, $batch)
}

3
如果您通过SharePoint 2010列表设置页面创建一个字段,那么字段名称中的任何空格都将变成_x0020_序列,成为该字段的内部名称。除了空格之外,SharePoint还会以类似的方式编码其他非标准字符。因此,您将在列表的网页上看到所需的名称,但编程访问将需要由SharePoint构建的内部名称(他们应该允许我们指定内部名称...)。
@MarekKembrowski对Op的评论说明了如何使用浏览器获取内部名称。

2

针对构造不良的查询,如没有顶层标签围绕同级元素的查询,会显示相同的错误信息。

他们查询:

<Where><Contains><FieldRef Name='...' /><Value Type='Text'>Foobar</Value></Contains></Where><OrderBy><FieldRef Name='Modified' /></OrderBy>

会给出相同的错误消息,但不会是:

<View><Where><Contains><FieldRef Name='...' /><Value Type='Text'>Foobar</Value></Contains></Where><OrderBy><FieldRef Name='Modified' /></OrderBy></View>

1
我曾经为此苦恼了很长时间,而答案就在我的眼前。 对我来说,Marek Kembrowski在原始问题中发布的评论正是我需要做的,但我忽略了它,因为它只是一条评论,所以我将重申Marek的话,用自己的话表达,希望下一个遇到这个问题的人不会错过上面发布的评论。
在SharePoint中,当您创建列时,有两个文本字段,您可以在其中提供信息来描述该字段,列名和说明。

enter image description here

我被击败的是,Sharepoint网站设置了列名[OrderID]和不同的描述[CON]。
在这里,您可以看到当我在发现问题后创建了OrderID之后,Sharepoint是什么样子的...区别在于一个OrderID列名说OrderID ;)

enter image description here

唯一看到原始列名的方法是像 Marek 上面提到的那样,在库设置中悬停在列上...这将在浏览器底部显示链接。如果您单击编辑它...甚至不正确...甚至不显示真实列名的任何内容...甚至在列名字段中显示说明名称...GGRRRRRRR! !!

无论如何,这是我用来检索数据的代码:

        // Starting with ClientContext, the constructor requires a URL to the 
        // server running SharePoint. 
        ClientContext context = new ClientContext(siteUrl);

        // The SharePoint web at the URL.
        Web web = context.Web;

        List docList = context.Web.Lists.GetByTitle("OrderDocuments");

        CamlQuery query2 = new CamlQuery();

        //This query will NOT work . . .CON is not a column in the sharepoint repository
        //query2.ViewXml = "<View><Query><Where><Eq><FieldRef Name='CON' /><Value Type='Number'>4</Value></Eq></Where></Query></View>";

        //This query WILL WORK.  The actual Column name is OrderID in Sharepoint
        query2.ViewXml = "<View><Query><Where><Eq><FieldRef Name='OrderID' /><Value Type='Number'>4</Value></Eq></Where></Query></View>";
        ListItemCollection collListItem = docList.GetItems(query2);

        context.Load(collListItem);
        context.ExecuteQuery();

+1给Marek,因为他提供了正确的解决方案。如果我第一次发现这个页面时就看到了它就好了。


1
我猜你遇到的问题不是 <FieldRef Name='Name' /> ,而是 <Value Type='Text'>。如果你检查 Name 字段的类型,你会发现它是一个文件。如果有人知道如何查询它,我也将非常感谢。目前我正在使用 Title。

我们必须使用内部名称,然后就没问题了。对于名称,它是<FieldRef Name='FileLeafRef' />。祝好运! - kevin

0

检查内部名称的另一种好方法是在列表设置中单击要检查的列。您可以将其内部名称作为查询字符串 字段 查看,如下所示。 Check internal name


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接