【问题标题】:Link data in custom SQL db with document library将自定义 SQL 数据库中的数据与文档库链接
【发布时间】:2009-12-03 11:09:22
【问题描述】:

环境: 我有一个用 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 保存在我的数据库中。你怎么看?

【问题讨论】:

    标签: sharepoint wss-3.0


    【解决方案1】:

    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 更改为上下文,因为在我的示例中您始终位于同一个网站集下。

    【讨论】:

    • 他说他没有关于如何在网络中存储文档的模型,我给出了一个完全通用的解决方案,无论他将这些文件移动到超过 9000 个子文件夹级别,它仍然可以工作。而且,真的,谁将完整的 url 存储在单独的数据库中?你把一张网移到另一个里面,然后繁荣,一切都破裂了。
    • 再说一次,我知道,但你说它只需要 guid,它不需要。只是想在这里完成。附言我也不会保存网址,它们可以更改:-D。
    • 我现在看到了,但我的上下文是在 uniqueId 方法中,说你不能只获取带有 ID 的文件,你还需要 WebID,我编辑了帖子以反映这一点:)跨度>
    【解决方案2】:

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

    附:对于 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
      }
    }
    

    【讨论】:

    • 谢谢 Colin,只是想显示用 Guids 打开并在没有打开项目的情况下输入它,这很准确,也请处置你的 spsite!
    • 我知道,但只是想为了操作而添加它,因为他可能(非常)是 sharepoint 新手。给你 1 分,并认为你的答案是正确的。
    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多