查询SharePoint数据的最佳方法是什么?

3

我应该直接使用ADO.NET访问数据库中的基础数据,还是.NET有更好的方法来实现这一点?

我目前正在使用SharePoint 2007,但我们即将升级到2010。我使用的是Visual Studio 2010。

5个回答

4
我强烈建议使用SharePoint对象来访问数据(无论是SP*类,还是使用SharePoint Web服务、LINQ to SharePoint等)。
不要直接使用纯ADO.NET访问底层数据库。主要原因是,通过使用支持的(官方)访问数据的方式,您可以减少出现问题的风险。例如,在更改表中的数据时,您不知道数据库中是否有另一个表的强制要求也需要更新。SharePoint对象会为您处理这些问题。
此外,如果您的SharePoint代码直接访问数据库,并且存在代码可能在任何热修复或SP版本发布后无法执行的风险,那么我认为Microsoft将不支持与您的SharePoint代码相关的问题,因为Microsoft可能随时更改数据库结构。

太棒了。您能推荐一些链接,帮助我开始使用SP*类吗? - Abe Miessler
+1...使用他们提供的内容,这是一个很好的建议。试图手动导航模式是有点困难的。 - curtisk

1
你是在谈论自定义数据库还是Sharepoint数据库?
你不应该直接操作Sharepoint数据库,因为这会使你的农场处于不受支持的状态。
如果你想要访问自定义数据库,请考虑使用Entity Framework: http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx

我从未想到SharePoint 2007可以做到这一点。你有一个关于SP2007的示例链接吗? - Hugo Migneron

1

这取决于上下文。回答以下问题将帮助您做出最佳选择以继续前进。

数据类型是什么?

从一个站点列出数据?使用Web服务

跨站点集合聚合内容?使用服务器对象模型

我想用这些数据做什么?

在简单的Web部件中显示摘要?考虑使用CQWP(内容查询WebPart)或DVWP(数据视图Webpart)

我交付此解决方案的时间表是什么?

如果您以前没有进行过SharePoint自定义代码部署,并且时间紧迫,请尽力坚持使用Web服务API。


在一个网站集合内还是跨多个网站集合?与列表一起工作的Web服务API(http://msdn.microsoft.com/en-us/library/ms774517(v=office.12).aspx)非常强大,使用它意味着您不必部署任何东西到服务器上,这是一个重大优点。但是,如果您需要跨网站集合进行操作,则必须在应用程序中硬编码对它们的引用,除非您可以访问服务器对象模型。 - jjr2527
我不同意这个观点。Web服务API还可以,但不如对象模型完整和强大。使用Web服务的唯一原因是当您想要从未安装SharePoint的远程客户端运行某些内容时。在站点内部(通过ASP.NET或后端代码)或在运行在SharePoint机器上的客户端应用程序中执行的任何操作都将受益于使用OM。我不明白跨站点集合/一个站点与此有什么关系。 - Hugo Migneron
Web服务可以在单个站点集合(SC)内提供对象模型(OM)的90%功能。如果需要超出该SC范围,则会变得更加复杂。这就是为什么我要问关于范围的原因。我们认为OM更强大,但代价也很高。打包/部署/更新OM解决方案的开销比仅使用Web服务的项目更新要高得多。根据您的时间表/范围/经验,构建OM上的东西所增加的成本可能是值得的。这种分析不应被忽视,仅仅因为OM给了您更多的权力。 - jjr2527

1
你绝对不应直接访问SharePoint内容数据库。
可以使用搜索Web服务获取项,或使用列表Web服务轻松地提取数据。如果您正在SharePoint中托管代码,请使用SharePoint对象模型。它足够简单,可满足您的需求。

1

就像其他人所说,不要直接触碰数据库。微软不会提供支持,即使他们这么做了,数据库结构也没有记录,并且比您第一次打开时看起来更复杂。

SharePoint对象模型中有很多对象。但是,如果要查询列表,则其中一些对象特别有用。我将为您提供一个简短的列表,以便您开始使用它们。一旦您熟悉这些对象在SharePoint中代表的内容,通过使用的函数返回或通过MSDN,您会很快找到其他对象。

1. SPList

可能是您最经常处理的类型。SPList代表任何类型的SharePoint列表。那是文档库、调查、图片库或任何自定义列表。几乎所有在SharePoint中的事情都是一个列表,从用户信息列表(用于身份验证)到博客(博客条目的列表)。

列表中的项目为SPListItem

2. SPWebSPSite

现在这可能有点令人困惑,但SPSite表示网站集合,而SPWeb表示单个网站。 假设您在hXXp://SharePointSite.com上有一个SharePoint站点,那么网站集合(SPSite)将是hXXp://SharePointSite.com,而SPWeb将是hXXp://SharePointSite.com/blog或hXXp://SharePointSite.com/about。

基本上,网站集合是SPWeb的集合,它们是SPList(以及其他您不关心的东西)的集合。 SPList始终驻留在网站中。

3. SPQuery

这是SharePoint的SQL。虽然有一种方法可以在2010年使用LINQ 2 SharePoint甚至在2007年也可以),但如果您即将转移到2010年,我不会费心去做它。但有时仍需要使用它。每当您想从列表中提取项目时,都要使用SPQueries。有时,循环遍历列表中的所有项目:foreach(item in SPList.Items)是可以的,但当列表变得更大时,您将希望使用SPQuery进行查询(与SQL / ADO相同)。
将所有内容放在一起举个例子。假设您在网站的某个地方有一个人员列表,并且您想知道谁是18岁。您的代码应该像这样:
    using(SPSite site = new SPSite("http://sharepointsite.com"))
    {
        using (SPWeb web = site.RootWeb)
        {
            SPList peopleList = web.Lists["People"];
            SPQuery query = new SPQuery();
            query.Query = 
                    "<Where>" +
                        "<Eq>" +
                            "<FieldRef Name='Age'/><Value Type='Number'>18</Value>" +
                        "</Eq>" +
                    "</Where>";

            SPListItemCollection items = peopleList.GetItems(query);

            foreach(SPListItem item in items)
            {
                //item here represents a person who's 18 years old.
            }
        }
    }

用于创建SPQuery的丑陋语言(或标记)称为CAML。当您需要帮助时,可以通过谷歌搜索来获取信息,但是为了让您开始入门,您可以阅读this article,其中解释了很多内容。这是我用来帮助构建查询的工具:U2U CAML Builder

顺便说一句,虽然可以通过Web服务查询列表,但我建议不要这样做。如果您可以在安装了SharePoint的计算机上运行代码,则对象模型比Web服务更好/更直观,而Web服务仅作为替代品存在,当未安装SharePoint时才使用它们。它们返回的数据是XML格式,格式化很麻烦。也没有那么多可用的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接