0

环境:我有一个用 C# 编写的 Windows 网络共享桌面应用程序,它依赖于 MSSQL 数据库。Windows sharepoint services 3.0 安装在同一台 Windows Server 2003 机器上(默认安装、单处理器、默认 sql express 内容数据库等)。

场景:应用程序在处理(创建工单)过程中生成需要保存在sharepoint上的MS Word文档,并且处理的结果必须链接到相应的文档。因此,对于 dbo.WorkOrders(一个工单)中的每个插入,都有一个 MS Word 文档。我需要将共享点库中的文档 ID 保存到我的数据库中,以便稍后可以对相关文档进行可能的手动更正。删除工作订单时,也必须删除 sharepoint 文档。此外,还有一个 dbo.Jobs 表,它是 dbo.WorkOrders 的父表,可以有多个工单。

我正在考虑在 sharepoint 上制作一个自定义列表,它有两个 ID 字段 - 一个是文档 ID,另一个是文档的 AutoID。我认为这在性能方面不是一个好方法,而且它需要太多的维护,因此更容易出错。

我正在考虑的另一条路径是元数据。我可以在 dbo.WorkOrders 中有一个唯一且自动递增的 Identity 字段,我可以将该值保存为文件名 (1.docx, 2.docx 3.docx ... n.docx 其中 n 是dbo.WorkOrder 的标识字段中的值)。在 Word 文档的元数据字段中,我可以保存 dbo.Jobs 中的作业 ID。

我也可以只增加 WorkOrder 中的标识字段(这将是一个 bigint),但是文件名会变得很难看,并且可能会溢出 ID 范围(因为可能有很多文档)。

我还考虑过并拒绝了其他选项,因为它们都不满足要求(链接数据源、子文件夹结构等)。我不确定如何进行。我是 sharepoint 的新手,对我来说仍然有点神秘,因为我不了解系统的所有内部工作原理。

你有什么建议?

编辑:

我想我将使用 guid 作为文件名,并在将文档发送到共享点后将这些 guid 保存在我的数据库中。你对那个怎么想的?

4

2 回答 2

2

SharePoint 中同一内容数据库(SQL 数据库)下的所有文档都存储在同一个表中,也就是说,无论文件位于共享点结构中的哪个位置,您都有一个唯一的文件 ID。

当通过它们的 UniqueID 检索文件时,如果您还知道它们的 SPWeb,API 只会为您提供获取它们的选项,这样您就可以轻松地存储您在外部数据库(或您的自定义列表、SPFile GUID 和 SPWeb)中拥有的每条记录GUID)通过以下方式检索它们:

using(SPWeb subweb = (SPContext.Current.Site.OpenWeb(new Guid("{000...}")))
{
    SPFile file = subweb.GetFile(new Guid("{111...}"));
    // file logic
}

ps.:正如 Colin 指出的,url 检索是可能的,但很混乱。我还将 SPSite 更改为上下文,因为在我的示例中您始终位于同一个网站集下。

于 2009-12-03T17:40:23.717 回答
1

就像 F.Aquino 所说,sharepoint 中的所有项目都已经有一个 UniqueId 字段(即 SPListItem.UniqueId 和 SPFile.UniqueId),这是一个 guid。将它与您的 web.'s guid 一起保存到您的数据库中。然后就可以使用F.Aquino提供的代码来获取文件,甚至是流的byte[]。

PS for F.Aquino,您的代码将 SPSite 留在内存中,请改用:

PPS 这只是澄清,将 F.Aquino 标记为答案。

using(SPSite site = new SPSite("http://url"))
{
  using(SPWeb subweb = site.OpenWeb(new Guid("{000...}"))
  {
    SPFile file = subweb.GetFile(new Guid("{111...}"));
   // file logic
  }
}
于 2009-12-03T17:52:15.033 回答