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

时间:2012-12-11 07:13:14

标签: sharepoint caml sharepoint-clientobject

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,则可以。

它出了什么问题? 列表中有名称。

提前致谢!!!

7 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:3)

不确定这是否会修复该错误消息,但这是您可以使用名称的方式:

名称(对于开箱即用的文档库)内部名称为“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)
}

答案 2 :(得分:2)

如果通过“SharePoint 2010列表设置”页面创建字段,则字段名称中的任何空格都将成为字段内部名称的_x0020_序列。除了空格,SharePoint将以类似的方式编码其他非标准字符。因此,您将在列表的网页上看到您想要的名称,但程序化访问将需要由SharePoint构建的内部名称(他们应该允许我们指定内部名称...

@MarekKembrowski对Op的评论告诉我们如何使用浏览器获取内部名称。

答案 3 :(得分:1)

我认为您遇到的问题不是<FieldRef Name='Name' />,而是<Value Type='Text'>。如果检查名称字段的类型,您会发现它是一个文件。如果有人知道如何查询我也会感激不尽。现在我正在使用Title。

答案 4 :(得分:1)

对于构造错误的查询,例如在兄弟元素周围没有最顶层标签的查询,会显示相同的错误消息。

他们查询:

<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>

答案 5 :(得分:1)

我挣扎了这么久,答案就在我面前。 对我来说,Marek Kembrowski在原始问题上发表的评论,正是我需要做的,但我把它弄清楚,因为这是一个评论,所以我要重申Marek用我自己的话说的话希望下一个带有这个问题的人不会错过上面发表的评论。

在sharepoint中,当您创建列时,有两个文本字段,您可以在其中提供信息来描述字段,列名称和描述。

enter image description here

杀了我的是,sharepoint网站设置了列名[OrderID]和不同的描述[CON]。

在这里,您可以看到Sharepoint首先创建的OrderID以及我在发现问题后创建的OrderID。 。 。区别在于OrderID列名称之一,即OrderID;)

enter image description here

我可以看到原始列名称的唯一方法是将鼠标悬停在“库设置”中的列上,如上面提到的Marek。 。 。这将显示浏览器底部的链接。如果单击进行编辑。 。 。它甚至不对。 。 。甚至没有显示真正的列名称。 。 .even在列名字段中显示描述名称。 。 。 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以获得上述正确解决方案。我希望我第一次找到这个页面时就能看到它。

答案 6 :(得分:0)

无需编写脚本即可检查内部名称的另一种好方法是转到列表设置并单击要检查的列。您可以将其内部名称视为查询字符串 Field,如下所示。 Check internal name