如何使用ASP.NET网页将PDF文件保存到SQL表?

时间:2015-01-13 20:47:50

标签: asp.net sql-server asp.net-webpages

这看起来像一大堆,但它实际上是一个非常集中的问题。这看起来比它更大,因为我提供了背景以及到目前为止我能够解决的问题。

让我从更精确的术语开始:"使用ASP.NET网页,我该如何:(a)" attach"使用Formview将已保存的PDF文件保存到数据库表,以及(b)允许用户在Gridview中选择数据库表行时查看保存的PDF文件?"

虽然我可以轻松存储PDF文件的路径和文件名,但如果重命名,移动或删除PDF文件,则数据库记录现在具有断开的链接。我的客户要求我"附上"实际的PDF文件到数据库记录,以防止链接断开。

这解释了原因:因为我的客户要求它。现在问题是如何解决问题。

以下是我在研究中所做的工作:

  1. 我学习了如何为SQL Server 2012数据库启用Filestream。
  2. 我创建了一个表,其中一列是varbinary(max)。 (表格定义语言如下所示在"代码块#1"。)
  3. 使用可用的在线示例,我能够测试和验证正在运行的T-SQL脚本 - 但是,我还没有成功将其作为存储过程,因为我不知道如何将文件名变为" OPENROWSET"声明。 (脚本如下所示在"代码块#2"。)
  4. 我在绘制大空白的地方是equatiion的ASP.NET方面。这是我希望建立的系统。只要他们按照这些方针工作,我就不会受到细节的限制。

    1. 用户使用Formview(通过SqlDataSource连接到数据库)输入在纸质表单上输入的值,最后" attach"保存的PDF文件到" Scanned_PDF_File"字段。
    2. 网格视图立即刷新,显示来自" Scanned_PDF"表,允许用户选择一行并查看保存的PDF文件。
    3. 这种方法可行吗?任何进一步研究的方向将不胜感激。谢谢你的帮助。


      代码块#1:这是SQL数据库表的定义。

      USE [IncidentReport_v3]
      GO
      
      /****** Object:  Table [dbo].[Scanned_PDFs]    Script Date: 1/13/2015 11:56:58 ******/
      SET ANSI_NULLS ON
      GO
      
      SET QUOTED_IDENTIFIER ON
      GO
      
      SET ANSI_PADDING ON
      GO
      
      CREATE TABLE [dbo].[Scanned_PDFs](
          [ID] [int] IDENTITY(1,1) NOT NULL,
          [DateEntered] [date] NOT NULL,
          [Scanned_PDF_File] [varbinary](max) NOT NULL,
          CONSTRAINT [PK_Scanned_PDFs] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (
              PAD_INDEX = OFF,
              STATISTICS_NORECOMPUTE = OFF,
              IGNORE_DUP_KEY = OFF,
              ALLOW_ROW_LOCKS = ON,
              ALLOW_PAGE_LOCKS = ON
          ) ON [PRIMARY]
      ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
      GO
      
      SET ANSI_PADDING OFF
      GO
      

      代码块#2:这是我用来测试插入带有PDF文件的行的能力的T-Sql脚本。如果我手动输入PDF文件名和路径,它可以很好地作为概念证明,但我需要将该文件名设置为用户提供的变量。我设想使用它作为存储过程 - 或者我可以在客户端使用此代码?还不确定。

      USE IncidentReport_v3;
      GO
      
      DECLARE @pdf AS VARBINARY(max)
      
      SELECT @pdf = cast(bulkcolumn AS VARBINARY(max))
      FROM openrowset(BULK '\\wales\e$\test\test.pdf', SINGLE_BLOB) AS x
      
      INSERT INTO dbo.Scanned_PDFs (
          DateEntered,
          Scanned_PDF_File
          )
      SELECT cast('1/12/2015' AS DATE),
          @pdf;
      GO
      

1 个答案:

答案 0 :(得分:0)

在访问数据层之前,您需要convert the PDF to a byte array。 [Scanned_PDF_File]被设置为结果。您可以parse the file name或从其他值中获取它。

This link here,可能会为您提供所需的一切。