惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
Vercel News
Vercel News
L
LangChain Blog
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
About on SuperTechFans
博客园_首页
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
美团技术团队
V
V2EX

博客园 - Burnett

【招聘.NET开发人员】待遇从优 MOSS 2007 SP1的一些补丁说明 Form认证的AD升级之道 谁动了我的Infopath附件?-Infopath上传文件产生“文件损坏” InfoPath的上传附件控件在MOSS中失效的解决办法 WorkFlow中引入自定义类对象在类级生命周期里引发工作流异常 我本将心向明月,奈何明月照沟渠。安装VS2008出错 - Burnett - 博客园 简单的IE浏览器代理切换软件-ezProxySwitch 关于写注册表的时候出现UnauthorizedAccessException异常的问题 今天发现MOSS2007的一个非常奇怪的地方 来自MOSS2007的Sex Bomb:自定义计时器 使用Web部件连接接口实现可以设置条件的过滤器 HRESULT 80070842 错误解决办法 Sharepoint 2007中可在列表中添加的内容类型 关于“无任何网络提供程序接受指定的网络路径错误” 没事放上来一个我做的第一个webpart组件可以显示农历,包含源代码 SharePoint站点迁移解决方案 【翻译 WSS3.0 SDK系列之二】内容类型导读 【翻译 WSS3.0 SDK系列之一】用户,组和认证
【剖析MOSS系列之一】万能的AllUserData
Burnett · 2008-02-24 · via 博客园 - Burnett


大家都知道,Sharepoint的列表实际上是对数据库中表(Table)的概念的延伸。但是当我们打开Sharepoint的时候,会发现,你建立的列表并没有存储成数据库中的一张表。那么列表是存储在哪里的呢?他们在运行中又是怎么被提取出来的呢?从这篇文章开始,我们要一点一点将MOSS的神秘的存储结构剖析清楚,不仅仅对MOSS的开发有帮助,也可以拓宽我们的软件体系设计的思维。

  打开SqlServer 中对应的数据库,我们会发现有很多很多的表存在,其中最为重要的当属dbo.AllUserData表。里边存储了基本上所有的数据。当然,你存储在列表中的数据也是存储在这里的。
  打开这个表,你会发现有很多的列。在后边就会知道这些列都是用来做什么的。
 

   其实,MOSS的列表概念可以理解成一张虚表,它并不是真实存在的,而是在需要的时候,从AllUserData中动态的提取出来,不过AllUserData存储的是所有的数据,像被丢在回收站的数据也是在里边被保留下来的,只不过被做了一个特殊的标记。

聪明的读者一定发现了,AllUserData中的tp_ListId就是确定不同的“虚表”的,如果写成sql查询,应该类似于这样

SQL代码

  1. select * from dbo.AllUserData where tp_ListId='your list id'  

是的,这样就可以简单的将自己需要的数据单独提取出来了。不过这只是第一步。最重要的是,列表中的列,在AllUserData中怎么表示呢?反正不能新建一个列,就改动AllUserData的结构吧。并且怎么处理不同列的相同列名的情况呢(比如内容类型)?聪明的MS开发者使用的是这么一种办法。在AllUserData表中,预先留置了很多很多的,多到你用不完的数据列,这些列的列名就是他们的类型+编号。比如nvarchar1,nvarchar2,float1,int3,datatime1......在MOSS中创建栏的时候,MOSS根据栏的类型,就会将数据存储到相应的这些数据列中。比如用户姓名会存入nvarchar1中,而年龄也许会存入int1中,这些存储不是随机的,而是采用的先到先服务(FIFS)的思想的。并且这些列与列名的映射都会存入dbo.AllLists表中的tp_Fields属性中。你可以在这个属性中看到映射。如果你稍微处理一下,这个属性中的数据可以按照XML文件来处理(后边会给出代码)。

好了,这个就是MOSS数据库的结构。有人会问,既然MOSS给了这么好用的List的概念,为什么还用煞费苦心的自己来读取数据呢?我想首先一个是更加了解MOSS体系结构,另外一个绕过了MOSS的一些体系上的效率问题,直接存取数据库的效率和灵活性,sql查询的强大,列表和列表自带的CAML查询应该是做不到的。

文章来源:http://www.windwhisper.cn/default.asp?id=32