65.9K
CodeProject 正在变化。 阅读更多。
Home

如何将任何文件存储到 SQL 数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (40投票s)

2009年5月22日

CPOL

2分钟阅读

viewsIcon

210007

downloadIcon

8642

一种将任何文件存储到 SQL 数据库的简单技术。

引言

本文档只是一个简单的示例,用于将任何文件格式存储到 SQL Server 数据库中。

背景

最近我完成了一个项目,需要存储各种文件,例如 Microsoft Office 文件格式、PDF、图像等。当我开始编写代码时,我编写了一个函数来存储二进制数据,然后我想到为什么不使用从存储过程直接批量插入。

Using the Code

我将讨论您可以通过以下简单的存储过程直接将二进制数据存储到 SQL 表中的方法

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		Author,,Md. Marufuzzaman
-- Create date: 
-- Description:	Description,, Insert the Binary data 
-- =============================================
-- EXEC dbo.spStoreBinaryFiles 'C:\eFaxFiles\eFaxPromo.pdf;D:\eFaxFiles\eFaxPromo.pdf;'
CREATE PROCEDURE [dbo].[spStoreBinaryFiles]
 @FILE_PATH	VARCHAR(MAX)
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @FILE_LENGTH  BIGINT
	DECLARE @FILE_DATA    VARBINARY(MAX)
	DECLARE @FILE_NAME	  VARCHAR(100)
	DECLARE @DOCUMENT_NAME VARCHAR(100) 
	DECLARE @DOCUMENT_NATURE VARCHAR(5)  

	DECLARE @VAL1 VARCHAR(100)
	DECLARE @VAL2 VARCHAR(100)

DECLARE curDOCUMENTS CURSOR FOR SELECT *  FROM dbo.SPLIT ( ';', @FILE_PATH )
OPEN curDOCUMENTS
FETCH NEXT FROM curDOCUMENTS 
INTO @VAL1,@VAL2

WHILE @@FETCH_STATUS = 0
BEGIN

	IF OBJECT_ID('#ORStable') IS NULL 
		BEGIN
			CREATE TABLE #ORStable _
				(Length BIGINT, vDocument VARBINARY(MAX))
			
			DECLARE @SQL_QUERY	  NVARCHAR(1000)

			SET @SQL_QUERY= '
			INSERT INTO #ORStable
			SELECT len(bulkcolumn), *
			FROM OPENROWSET(BULK '''+@VAL2+''', _
					SINGLE_BLOB) AS BinaryData'
			exec SP_executesql @SQL_QUERY
 
		END
	
		EXEC dbo.spGetDocumentNature @VAL2, @DOCUMENT_NATURE  OUTPUT
		EXEC dbo.spGetDocumentName @VAL2, @DOCUMENT_NAME  OUTPUT
        
      SELECT TOP 1 @FILE_LENGTH = Length, @FILE_DATA = vDocument FROM #ORStable
	  INSERT INTO dbo.tblBinaryFiles
			(
				 [File]
				,[Path]	
				,[Ext]
				,[Size]
				,[Binary]
			)

	  VALUES(
				 @DOCUMENT_NAME
				,@VAL2
				,@DOCUMENT_NATURE
				,@FILE_LENGTH
				,@FILE_DATA
			)
     
     DROP TABLE dbo.#ORStable

    FETCH NEXT FROM curDOCUMENTS 
    INTO @VAL1,@VAL2

END

CLOSE curDOCUMENTS
DEALLOCATE curDOCUMENTS 

END

OPENROWSET:包含访问 OLE DB 数据源中的远程数据所需的所有连接信息。此方法是访问链接服务器的一种替代方法,是一种一次性的、临时连接和访问远程数据的方式,使用 OLE DB。OPENROWSET 函数可以在查询的 FROM 子句中引用,就像它是一个表名一样。OPENROWSET 函数也可以引用为 INSERTUPDATEDELETE 语句的目标表,这取决于 OLE DB 提供程序的功能。虽然查询可以返回多个结果集,但 OPENROWSET 仅返回第一个结果集。

大型二进制对象 (BLOB):BLOB 数据类型用于存储程序可以生成的数据:图形图像、卫星图像、视频片段、音频片段等。

BulkColumn:查询中引用的 BulkColumn 代表要插入的 varbinary 值。

示例批量插入 SQL 语句

			DECLARE @SQL_QUERY	  NVARCHAR(1000)

			SET @SQL_QUERY= '
			INSERT INTO #ORStable
			SELECT len(bulkcolumn), *
			FROM OPENROWSET(BULK '''+@VAL2+''', _
					SINGLE_BLOB) AS BinaryData'
			exec SP_executesql @SQL_QUERY

--Here variable VAL2 contains the single file path information.
--Example VAL2 = "\\192.168.1.1\myFiles\myFile.pdf"
--        VAL2 = "C:\myFiles\myFile.pdf" 

我编写了一些其他的 存储过程 来获取文件名、文件性质以及用于拆分文件路径的函数。我没有包含这段代码,因为我不想偏离本文档的主要目标。我希望这对您有所帮助。祝您使用愉快。

关注点

如果您使用任何网络路径,请确认您的 SQL 登录用户被允许在操作系统上执行批量加载。

© . All rights reserved.