将自定义SQL db中的数据与文档库链接

时间:2009-12-03 11:09:23

标签: sharepoint wss-3.0

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

方案: 应用程序在处理(创建工单)期间生成需要保存在sharepoint上的MS Word文档,并且流程的结果必须链接到相应的文档。 因此,对于dbo.WorkOrders(一个工单)中的每个插入,都有一个MS Word文档。我需要将文档ID从sharepoint库保存到我的数据库,以便稍后可以对相关文档进行可能的手动更正。删除工作订单时,还必须删除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范围(因为可能有很多文档)。

我还考虑和解雇了其他选项,因为它们都不满足要求(链接数据源,子文件夹结构等)。我不知道该怎么办。我是分享点的新手,对我来说这仍然有点神秘,因为我不了解系统的所有内部工作原理。

你有什么建议?

编辑:

我想我会使用guid作为文件名,并在将文档发送到sharepoint后将这些guid保存在我的数据库中。你觉得怎么样?

2 个答案:

答案 0 :(得分:2)

同一内容数据库(SQL数据库)下的SharePoint中的所有文档都存储在同一个表中,即表示您拥有文件的唯一ID,无论它们位于sharepoint结构中的哪个位置。

通过其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。:正如科林指出的那样,网址检索是可能的但是很麻烦。我还将SPSite更改为上下文,因为在我的示例中,您始终位于相同的网站集中。

答案 1 :(得分:1)

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

P.S。对于F.Aquino,你的代码将SPSite留在内存中,改为使用它:

P.P.S这只是澄清,将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
  }
}