分类: 系统运维
2010-03-21 13:53:57
场景: SharePoint 2007 InfoPath Forms Services
读者: 适合对InfoPath表单设计有一定经验的朋友
在浏览器中使用InfoPath表单时, 经常要使用数据连接从数据源调用数据, 在浏览器中, 能使用参数查询(筛选)的就只有Web Service可以实现, 用参数查询数据库是要写代码了(如Dosboy翻译的 http://kb.cnblogs.com/a/1600492/ 谢谢!), 查询SharePoin的列表数据虽然可以直接使用, 但要实现筛选就比较困难, 在不写代码的情况下, 可以使用表单节控件的条件格式进行筛选, 但如果数据量大, 客户端浏览器的CPU占用就经常100%(客户端的AJAX代码), 返回数据量大, 也明显不是办法. SharePoint本身有Web Service, 但InfoPath数据连接不能直接调用(不知微软怎么想的!), 那只有写代码了(园子里有相关示例, 如: http://www.cnblogs.com/sean_zhang/archive/2009/07/23/1529436.html 谢谢!). 折腾了一番以后, 发现还是直接使用SharePoint本身的Web Service是比较好的办法, 返回数据量少, 查询性能也好, 为了更好地重用代码, 我比较建议在服务器上部署Web Service Proxy. 就以参数查询列表数据为例, CodePlex有个好的代码(), 本文就以此为例.
核心代码(VB.NET)
Public Class GetListItems_ Public Function GetListItems(ByVal listName As String, ByVal viewID As String, ByVal query As String, ByVal viewFields As String, ByVal rowLimit As String, ByVal queryOptions As String, ByVal webID As String) As XmlNode Dim service As SharePointListsWS.Lists = GetWebServiceInstance(webID) Dim queryElement As XmlNode = CreateNode("Query", query) Dim viewFieldsElement As XmlNode = CreateNode("ViewFields", viewFields) Dim queryOptionsElement As XmlNode = CreateNode("QueryOptions", queryOptions) Return service.GetListItems(listName, viewID, queryElement, viewFieldsElement, rowLimit, queryOptionsElement, webID) End Function Private Function GetWebServiceInstance(ByVal webID As String) As SharePointListsWS.Lists Dim service As New SharePointListsWS.Lists service.Credentials = System.Net.CredentialCache.DefaultCredentials service.Url = SPContext.Current.Web.Url + "/_vti_bin/Lists.asmx" Return service End Function Private Function CreateNode(ByVal name As String, ByVal innerXml As String) Dim document As New XmlDocument Dim node As XmlNode = document.CreateElement(name) node.InnerXml = innerXml Return node End Function End Class
在实际的应用中, 可以使用此方法实行精确或模糊查询, 只要是CAML能使用的查询方法都行, 可以调用多个参数变量. 也可以实现多级联动的下拉列表查询, 且不用在表单中写代码, 功能还是很强大的, 性能比起在表单中写代码也要好.