16
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,没关系。

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

4

7 回答 7

19

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

于 2013-01-28T19:23:37.780 回答
6

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

名称(对于开箱即用的文档库)内部名称是"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)
}
于 2013-06-11T19:50:40.273 回答
3

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

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

于 2016-10-11T16:20:12.900 回答
1

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

于 2013-05-10T12:40:32.280 回答
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>
于 2016-07-22T13:38:58.063 回答
1

我为此挣扎了太久,答案就在我面前。对我来说,Marek Kembrowski 对原始问题发表的评论正是我需要做的,但我对它很感兴趣,因为它是评论,所以我将用我自己的话重申 Marek 所说的话,希望与此问题一起出现的下一个人不会错过上面发布的评论。

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

在此处输入图像描述

杀死我的是,sharepoint 站点是使用列名 [OrderID] 和不同的描述 [CON] 设置的。

在这里,您可以看到 Sharepoint 与首先创建的 OrderID 和我在找出问题后创建的 OrderID 的样子。. . 不同之处在于 OrderID 列名称之一是 OrderID ;)

在此处输入图像描述

我可以看到原始列名的唯一方法是将鼠标悬停在库设置中的列上,就像上面提到的 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();

为上述正确解决方案向 Marek +1。我希望我在第一次找到这个页面时就看到了它。

于 2017-07-18T15:03:48.677 回答
0

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

于 2021-04-06T04:44:45.470 回答