重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Case 1简单数据类型的自定义列表查询
公司专注于为企业提供做网站、成都网站设计、微信公众号开发、商城建设,微信小程序,软件按需制作等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,创新互联更提供一系列网站制作和网站推广的服务。
假设我们现在有一个Country列表,记录了全球200多个国家和地区的中文名,英文名,建国日期,面积,人口等信息,整个列表只有字符串、日期、数字等简单类型,没有User,Lookup等数据类型,则整个List的数据都可以从[dbo].[AllUserData]查询获得,具体查询步骤:
1. 查询[dbo].[AllLists]找到ListId。
select *
from [dbo].[AllLists]
where tp_Title = 'Country'
由于整个网站集都是共用一个Content DB数据库,所以可能会出现在多个网站中都创建了Country这个List的情况,那么就会返还多条结果,这个情况下,就需要关联AllWebs表,根据网站的Url来判断到底哪个ListId才是我们需要的。
select w.FullUrl,l.tp_ID
from [dbo].[AllLists] l
inner join [dbo].[AllWebs] w
on l.tp_WebId=w.Id
where l.tp_Title = 'Country'
在找到了ListId后,接下来所有查询都会用到这个Id。
2. 查询[dbo].[AllUserData],找到需要查询的列,并命名为别名。
假设第一步我们查询出来的ListId是'F20E316B-EA24-4164-9437-BBB17C182691',那么我们查询Country这个列表的所有数据的SQL就是:
SELECT *
FROM AllUserData
where tp_ListId='F20E316B-EA24-4164-9437-BBB17C182691'
这个表的列非常多,在SharePoint 2013的环境中会更多,但是存储数据的列都是用“数据类型+数字”来命名的。所以如果要找建国日期这个字段对应的列,那么就去看datetime1 datetime2等,如果要找面积,人口等数值类型的列,那就去看float1 float2等;如果要找中文名,英文名之类的字符串列,那就要看nvarchar1 nvarchar3等列。这里基本上都是靠眼睛来看的,根据查询的结果推断哪些字段存储了哪些数据。在得知每个字段的对应后,即可修改查询,将别名加上。
SELECT d.nvarchar1 as ChineseName,
d.nvarchar3 as EnglishName,
d.datetime1 as FoundingDate,
d.float1 as Area,
d.float2 as Population
FROM AllUserData d
where tp_ListId='F20E316B-EA24-4164-9437-BBB17C182691'
【注意:SharePoint并没有在数据库中以很方便的结构展现哪些列表字段对应哪个数据库字段,在AllLists表中,虽然有个字段tp_Fields,但是在SharePoint2010及之后,该字段是压缩的二进制,使用SQL是无法读取的。所以根本不可能通过查询数据库得知哪个字段的别名是什么。】参考:
3. 过滤掉已删除的数据。
如果数据经过删除,然后又重新录入,那么我们就会发现,第2步的查询结果会把删除的和重新录入的数据都查询出来。SharePoint采用的删除方法都是软删除,通过设置一个标志位来表示一条数据已经被删除,所以我们只需要将删除标识tp_DeleteTransactionId=0添加到where条件中,即可将未删除的数据返回。
SELECT d.nvarchar1 as ChineseName,
d.nvarchar3 as EnglishName,
d.datetime1 as FoundingDate,
d.float1 as Area,
d.float2 as Population
FROM AllUserData d
where tp_ListId='F20E316B-EA24-4164-9437-BBB17C182691' and d.tp_DeleteTransactionId=0
4. 过滤掉历史版本的数据。
如果这个列表开启了版本控制,那么我们查询的结果可能包含多个版本的数据,而我们只需要最新版本的数据,不希望历史版本数据出现在查询中。AllUserData表中,使用tp_IsCurrentVersion字段来标识这条数据是最新的当前版本还是历史版本。
于是,查询最新版本的SQL改为:
SELECT d.nvarchar1 as ChineseName,
d.nvarchar3 as EnglishName,
d.datetime1 as FoundingDate,
d.float1 as Area,
d.float2 as Population
FROM AllUserData d
where tp_ListId='F20E316B-EA24-4164-9437-BBB17C182691' and d.tp_DeleteTransactionId=0 and d.tp_IsCurrentVersion=1
5. 过滤掉内容审批未通过的数据。
如果这个列表开启了内容审批,那么就会出现多个最新版本的情况,一个是已经被审批通过的版本,另一个是修改后还没有进行审批的版本。一般来说,我们是希望只有审批通过的才查询出来,用户进行修改后,只要审批状态不是Approve,那么就不应该出现在查询结果中。在AllUserData表中,使用tp_ModerationStatus字段来标识这行数据是否已经被审批通过。这是一个枚举类型,其值为:
0 The list item is approved.
1 The list item has been denied approval.
2 The list item is pending approval.
3 The list item is in the draft or checked out state.
4 The list item is scheduled for automatic approval at a future date.
这里,我们只要审批通过的数据,所以我们的SQL更新为:
SELECT d.nvarchar1 as ChineseName,
d.nvarchar3 as EnglishName,
d.datetime1 as FoundingDate,
d.float1 as Area,
d.float2 as Population
FROM AllUserData d
where tp_ListId='F20E316B-EA24-4164-9437-BBB17C182691' and d.tp_DeleteTransactionId=0 and d.tp_IsCurrentVersion=1 and tp_ModerationStatus=0
moss的分页查询真是个麻烦的事情,用datatable吧,心有不甘,于是想在caml语句上想办法
经过多次的失败,原来一切都是SPQuery在捣鬼
我们先来看SPQuery中的三个属性
1.RowLimit每次查询能显示的最大记录数
2.ViewFields
查询后得到的列
3.ListItemCollectionPosition
查询时的开始位置
这时,可以通过XmlDocument的SelectSignleNode("/View/RowLimit").InnerText,修改其中的数值。
不过,你如果去查看SPQuery.RowLimit,你会发现数值没有任何变化
ViewFields:
同样,这个属性也和 RowLimit一样,他只认第一次设定的值。
第二种方法:每次查询新建SPQuery实例
这种方法没有上述的任何一个缺点,谁叫
它是第一次呢Code:
SPListItemCollectionPosition position = null;
position = new SPListItemCollectionPosition(string.Format(
"Paged=TRUEp_ID={0}"
,items[1]["ID"]));
oSPQuery.ListItemCollectionPosition = position;
汗,懒病发作了,不想写了。
使用文件资源查看器。
1、首先打开电脑,输入密码或者生物认证。
2、然后让对方发送sharepoint文件,在电脑上接收。
3、最后使用文件资源查看器查看即可。