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

How can save a PDF file to a SQL table using an ASP.NET webpage?

这看起来是一大堆,其实是一个非常有针对性的问题。这看起来比实际更大,因为我提供了上下文以及到目前为止我已经能够解决的问题。

让我以更精确的方式开始这个问题:"Using an ASP.NET webpage, how can I: (a) "使用 Formview 将保存的 PDF 文件附加到数据库 table,并且 (b) 允许当数据库 table 行在 Gridview 中 select 时,用户查看保存的 PDF 文件?

虽然我可以轻松存储 PDF 文件的路径和文件名,但如果重命名、移动或删除 PDF 文件,数据库记录现在会损坏 link。我的客户要求我 "attach" 将实际的 PDF 文件记录到数据库中以防止损坏 links。

这回答了原因:因为我的客户要求它。现在是弄清楚如何做的问题了。

以下是我目前在研究中所做的:

  1. 我了解了如何为 SQL Server 2012 数据库启用文件流。
  2. 我创建了一个 table,其中一列是 varbinary(max)。 (Table 定义语言如下所示 "Code Block #1"。)
  3. 使用可用的在线示例,我能够测试和验证一个有效的 T-SQL 脚本——但是,我还没有成功地将它变成一个存储过程,因为我不知道如何制作文件名是 "Openrowset" 语句中的一个变量。 (脚本如下所示 "Code Block #2"。)

我画大空白的地方是等式的 ASP.NET 边。这是我希望建立的系统。只要他们按照这些思路工作,我就不会在细节方面受到限制。

  1. 用户使用 Formview(通过 SqlDataSource 连接到数据库)输入在纸质表单上输入的值,最后 "attach" 将保存的 PDF 文件保存到 "Scanned_PDF_File" 字段。
  2. gridview 立即刷新,显示 "Scanned_PDFs" table 的结果,允许用户 select 一行并查看保存的 PDF 文件。

这种方法可行吗?任何进一步研究的方向将不胜感激。感谢您的帮助。


代码块 #1:这里是 SQL 数据库 table.

的定义
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:这是我用来测试插入一行 w/a 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

您需要 convert the PDF to a byte array before getting to the data layer. The [Scanned_PDF_File] gets set to the result. You can parse the file name 或从其他值中获取它。

This link here,可能会给你所需的一切。