我正在使用VB.net设计Windows窗体应用程序。我试图让应用程序返回特定SharePoint列表中的行数。当我删除ndQuery.InnerXml代码时,一切都很完美;但是,我想在计算之前过滤列表。我要过滤的两列是“Assigned Employee”和“status”。我在Stack(SharePoint SoapServerException calling GetListItems web service)上查看了很多不同的帖子,但我的Exception与Query有关。 soapserverException的详细信息是:“未正确安装一个或多个字段类型。请转到列表设置页面以删除这些字段:0x81020014。”
我尝试进入关系页面,但我无法浏览它:
(url)/Relationships%20List/allitems.aspx
任何人都可以看到查询代码有问题吗?
Imports System
Imports System.IO
Imports System.Net
Imports System.Xml
Imports <xmlns="rs">
Public Class Form1
Dim i As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim listService As New getListItems.Lists
listService.Credentials = CredentialCache.DefaultCredentials
listService.Url = "http://(servername)/_vti_bin/Lists.asmx"
Dim xmlDoc = New System.Xml.XmlDocument()
Dim ndQuery As XmlNode =
xmlDoc.CreateNode(XmlNodeType.Element, "Query", "")
Dim ndViewFields As XmlNode =
xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "")
Dim ndQueryOptions As XmlNode =
xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "")
ndQueryOptions.InnerXml =
"<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>"
ndViewFields.InnerXml = "<FieldRef Name='Assigned Employee'/><FieldRef Name='Status'/>"
ndQuery.InnerXml = "<Where><And><Contains><FieldRef Name ='Assigned Employee'/><Value Type='Text'>Engineer</Value></Contains><Contains><FieldRef Name='Status'/><Value Type='Text'>New</Value></Contains></And></Where>"
Try
Dim ndListItems As XmlNode =
listService.GetListItems("Requests", Nothing, ndQuery, _
ndViewFields, Nothing, ndQueryOptions, Nothing)
Dim n1 As XmlNode = ndListItems.Item("rs:data")
Dim a As String = n1.Attributes("ItemCount").InnerText
'Attempted For each loop, but not needed:
'Dim listItemCount As String
'Dim innerXML = New System.Xml.XmlDocument
'innerXML.LoadXml(ndListItems.InnerXml)
'Dim rows As XmlNodeList = innerXML.GetElementsByTagName("rs:data")
'For Each (XmlNode Attribute In rows)
'Next
Label1.Text = a
Catch ex As System.Web.Services.Protocols.SoapException
Label1.Text = ("Message:" + ControlChars.Lf + ex.Message +
ControlChars.Lf +
"Detail:" + ControlChars.Lf + ex.Detail.InnerText +
ControlChars.Lf +
"StackTrace:" + ControlChars.Lf + ex.StackTrace)
End Try
End Sub
End Class
答案 0 :(得分:1)
您可能需要将字段名称中的空格替换为_x0020_
,例如
<FieldRef Name='Assigned_x0020_Employee'/>
Name
属性采用字段的内部名称,因此请仔细检查您正在使用的内容。
答案 1 :(得分:0)
当我遇到“过去没有正确安装一个或多个字段类型”的错误时,通常是由于我的CAML WHERE标准指示某个字段是某种类型(如果我指示)值类型=“文本”,实际上是查找)。
如果您从U2U获得CAML查询生成器(免费),您可以将其指向您的站点(使用SharePoint的内置Web服务)并使用其拖放设计器构建您的CAML查询。在查询工作后,只需单击“编辑”选项卡,它将显示SharePoint所需的确切CAML。我的猜测是你会发现字段类型设置不正确。安装后整个过程大约需要10分钟。
答案 2 :(得分:0)
我在将查询语句拆分为两部分时发现了这个问题:
'ndQuery.InnerXml = "<Where><Eq><FieldRef Name ='Assigned_x0020_Employee'/><Value Type='Text'>Engineer</Value></Eq></Where>"
'ndQuery.InnerXml = "<Where><Eq><FieldRef Name ='Status'/><Value Type='Text'>New</Value></Eq></Where>"
我发现尽管SP列表中的一个列被命名为“Assigned Employee”,但实际的FieldRef名称只是员工。当我修改代码以包含它时,错误就消失了。我花了所有时间来更改值类型,而不是查看FieldRef名称
最终结论: “一个或多个字段类型未正确安装”错误不仅会在“值类型”不正确时返回,而且还会在“FieldRef名称”包含错误标签时返回。
最终工作代码行:
ndQuery.InnerXml = "<Where><And><Eq><FieldRef Name ='Employee'/><Value Type='Text'>Engineer</Value></Eq><Eq><FieldRef Name='Request_x0020_Status'/><Value Type ='Text'>New</Value></Eq></And></Where>"