如何使用 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。
这回答了原因:因为我的客户要求它。现在是弄清楚如何做的问题了。
以下是我目前在研究中所做的:
- 我了解了如何为 SQL Server 2012 数据库启用文件流。
- 我创建了一个 table,其中一列是 varbinary(max)。
(Table 定义语言如下所示 "Code Block #1"。)
- 使用可用的在线示例,我能够测试和验证一个有效的 T-SQL 脚本——但是,我还没有成功地将它变成一个存储过程,因为我不知道如何制作文件名是 "Openrowset" 语句中的一个变量。 (脚本如下所示 "Code Block #2"。)
我画大空白的地方是等式的 ASP.NET 边。这是我希望建立的系统。只要他们按照这些思路工作,我就不会在细节方面受到限制。
- 用户使用 Formview(通过 SqlDataSource 连接到数据库)输入在纸质表单上输入的值,最后 "attach" 将保存的 PDF 文件保存到 "Scanned_PDF_File" 字段。
- 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,可能会给你所需的一切。
这看起来是一大堆,其实是一个非常有针对性的问题。这看起来比实际更大,因为我提供了上下文以及到目前为止我已经能够解决的问题。
让我以更精确的方式开始这个问题:"Using an ASP.NET webpage, how can I: (a) "使用 Formview 将保存的 PDF 文件附加到数据库 table,并且 (b) 允许当数据库 table 行在 Gridview 中 select 时,用户查看保存的 PDF 文件?
虽然我可以轻松存储 PDF 文件的路径和文件名,但如果重命名、移动或删除 PDF 文件,数据库记录现在会损坏 link。我的客户要求我 "attach" 将实际的 PDF 文件记录到数据库中以防止损坏 links。
这回答了原因:因为我的客户要求它。现在是弄清楚如何做的问题了。
以下是我目前在研究中所做的:
- 我了解了如何为 SQL Server 2012 数据库启用文件流。
- 我创建了一个 table,其中一列是 varbinary(max)。 (Table 定义语言如下所示 "Code Block #1"。)
- 使用可用的在线示例,我能够测试和验证一个有效的 T-SQL 脚本——但是,我还没有成功地将它变成一个存储过程,因为我不知道如何制作文件名是 "Openrowset" 语句中的一个变量。 (脚本如下所示 "Code Block #2"。)
我画大空白的地方是等式的 ASP.NET 边。这是我希望建立的系统。只要他们按照这些思路工作,我就不会在细节方面受到限制。
- 用户使用 Formview(通过 SqlDataSource 连接到数据库)输入在纸质表单上输入的值,最后 "attach" 将保存的 PDF 文件保存到 "Scanned_PDF_File" 字段。
- 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,可能会给你所需的一切。