`
flashcloud
  • 浏览: 189218 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用SQL Server存储过程将BLOB/Image等图片或二进制数据另存为磁盘文件

阅读更多

--要想下面的存储过程正常执行,必须先开启OLE对象的安全权限
sp_configure 'show advanced options',1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures',1;
GO
RECONFIGURE;
GO

--存储过程:将二进制数据保存到指定的目录
--需要先将@FilePathAndName所在目录的安全权限,添加Windows账户“Network Service”的写入权限,才会成功
CREATE PROCEDURE [dbo].[up_SaveBinaryToFile](@Binary VARBINARY(MAX), @FilePathAndName VARCHAR(MAX))
AS 
BEGIN
DECLARE @ObjectToken INT
DECLARE @ErrorSource VARCHAR(255)
DECLARE @ErrorDesc VARCHAR(255)
DECLARE @ObjectReturn INT
	
	EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
	EXEC sp_OASetProperty @ObjectToken, 'Type', 1
	EXEC sp_OAMethod @ObjectToken, 'Open'
	EXEC @ObjectReturn = sp_OAMethod @ObjectToken, 'Write', NULL, @Binary
	IF (@ObjectReturn <> 0)
    BEGIN
        EXEC sp_OAGetErrorInfo @ObjectToken, @ErrorSource OUTPUT, @ErrorDesc OUTPUT 
        RAISERROR('Write Error (return: ''%u'', source: ''%s'', description: ''%s'')', 15, 1, @ObjectReturn, @ErrorSource, @ErrorDesc)
    END
    
	EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FilePathAndName, 2
	EXEC sp_OAMethod @ObjectToken, 'Close'
	EXEC sp_OADestroy @ObjectToken
END
GO

--创建表[Temp_File]:如果在此表中插入新行时,isSave为1,则将文件保存到服务器指定的路径
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Temp_File](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[uuid] [uniqueidentifier] NOT NULL,
	[title] [nvarchar](250) NULL,
	[name] [nvarchar](50) NULL,
	[ext] [nvarchar](50) NULL,
	[path] [nvarchar](max) NULL,
	[size] [int] NULL,
	[binData] [image] NULL,
	[comment] [nvarchar](max) NULL,
	[ownedBy] [nvarchar](50) NULL,
	[isSave] bit NULL	--如果为1,则将数据作为物理文件存储至[path]
 CONSTRAINT [PK_Temp_File] 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
ALTER TABLE [dbo].[Temp_File] ADD  CONSTRAINT [DF_Temp_File_uuid]  DEFAULT (newid()) FOR [uuid]
GO

--以下是通过触发器来调用:当在此表中新增一行时,则将文件保存到服务器指定的路径
CREATE TRIGGER tgr_exportTempFileTosvrDisk
ON Temp_File 
	INSTEAD OF INSERT
AS
	DECLARE @uuid uniqueidentifier
	DECLARE @title NVARCHAR(250)
	DECLARE @name NVARCHAR(50)
	DECLARE @ext NVARCHAR(50)
	DECLARE @isSave BIT	
	DECLARE @size INT
	DECLARE @fileData VARBINARY(MAX)
	DECLARE @comment NVARCHAR(MAX)
	DECLARE @ownedBy NVARCHAR(50)
		
	DECLARE @TempFolder NVARCHAR(256)
	DECLARE @SavedFile NVARCHAR(MAX)
	DECLARE @ObjectReturn INT
	DECLARE @Fso INT
	DECLARE @File INT	
	
	select @uuid = [uuid]
	  ,@title = [title]
      ,@name = [name]
      ,@ext = [ext]
      ,@isSave = [isSave]
      ,@size = [size]
      ,@fileData = [binData]
      ,@comment = [comment]
      ,@ownedBy = [ownedBy]
	  from inserted;	
	
	--文件写入 WINXP : C:\Documents and Settings\NetworkService\Local Settings\Temp
	--		   WIN7/8/10/2008/2012:   C:\Windows\ServiceProfile\NetworkService\AppData\Local\Temp\
	IF @isSave = 1
	BEGIN
		EXEC @ObjectReturn = sp_OACreate 'Scripting.FileSystemObject', @Fso OUTPUT;
		EXEC @ObjectReturn = sp_OAMethod @Fso, 'GetSpecialFolder', @File OUTPUT, 2; --系统临时文件夹
		EXEC @ObjectReturn = sp_OAGetProperty @File, 'Path', @TempFolder OUTPUT;
		SET @SavedFile = @TempFolder + N'\' + CONVERT(NVARCHAR(256), @uuid) + '.' + @ext;
		
		EXEC up_SaveBinaryToFile  @fileData , @SavedFile;
	END
	
	insert into Temp_File ([title],[name],[ext],[isSave],[size],[binData],[comment],[ownedBy]) values (@title,@name,@ext,@isSave,@size,@fileData,@comment,@ownedBy);
	update Temp_File set [path]=@SavedFile where [uuid]=@uuid
GO

------------------------------------------------------------
--以下是直接使用SQL语句,手动调用上述存储过程保存文件
DECLARE @fileData VARBINARY(MAX)
DECLARE @fileName NVARCHAR(255)
DECLARE @extName NVARCHAR(255)
DECLARE @filePath NVARCHAR(MAX)
select top 1 @fileData = binData, @fileName = [name], @extName= [type] from dbo.system_picsLib
SET @filePath = 'C:\temp\'+@fileName+'.'+@extName
exec up_SaveBinaryToFile  @fileData, @filePath
 

 

分享到:
评论

相关推荐

    关于在SQL Server数据库系统中存取BLOB数据的探讨.pdf

    这种方法可以将BLOB数据直接存储在SQL Server数据库系统中,而不是作为文件存储在磁盘上。这可以提高数据的安全性和可维护性。 笔者还讨论了BLOB数据在SQL Server数据库系统中的存储方式不同于普通数据类型的存储...

    用文件流保存二进制图片

    3. **插入图片数据**:读取磁盘上的二进制图片文件,然后使用`SqlBulkCopy`或执行SQL INSERT语句将数据插入到新的表中。在INSERT语句中,使用`OPENROWSET`函数或` Bulk Insert`命令将二进制文件加载到数据库。 4. *...

    C#将图片变成二进制保存到数据库

    在数据库中,二进制数据(通常以BLOB,即Binary Large Object形式存在)可以存储任何类型的非文本数据,如图片、音频或视频文件。这是因为数据库系统通常不直接支持对这些非结构化数据的存储,而二进制数据格式则能...

    批量导出ORACLE数据库BLOB字段生成图片

    Oracle数据库在存储大对象(BLOB)数据时,提供了高效且灵活的方式,使得二进制数据如图片、文档等能够安全地保存在数据库中。批量导出Oracle数据库中的BLOB字段生成图片,是一项常见的需求,尤其对于那些需要将...

    文件(word,txt...)保存到sql server

    首先,我们需要了解SQL Server支持的数据类型,其中BLOB(Binary Large Object)类型如VARBINARY(MAX)或IMAGE用于存储二进制大对象,如文件。Word文档、TXT文本等非结构化数据可以被转换为二进制格式并存储在这样的...

    ASP.NET将图片以二进制的形式保存到数据库

    在数据库中,二进制大型对象(BLOB)类型如VARBINARY或IMAGE用于存储非结构化的数据,如图像、音频或视频文件。ASP.NET中,我们将图片转换为二进制数据,然后以BLOB的形式存储到数据库中。 二、图片转换为二进制 1....

    SQL 2005保存文件

    在SQL Server 2005中,保存文件的能力是一项关键功能,它允许用户将各种类型的文件,如文档、图片或任何其他二进制数据,存储到数据库中。这个过程通常涉及使用SQL Server的BLOB(Binary Large Object)数据类型,如...

    插入、取出Blob类型的数据代码示例

    Blob(Binary Large Object)在数据库中是用来存储大量二进制数据的数据类型,常用于存储图像、音频、视频等非文本信息。本示例主要讲解如何在Oracle数据库中操作Blob类型的数据,包括插入和取出。 首先,我们需要...

    C#把图片转换成数据流存入数据库中再读出来变成图片

    此外,随着技术的发展,现代数据库系统如SQL Server 2016及更高版本推荐使用文件存储(如FILESTREAM)或外部存储服务(如Azure Blob Storage)来存储大型二进制对象,以提高性能和可扩展性。 TestSaveImage文件可能...

    二进制图片导出(完整版vs2012winfom程序)

    这个"二进制图片导出(完整版vs2012winfom程序)"是一个实用工具,它结合了数据库连接、数据查询、二进制数据处理、文件操作等多种技术,为用户提供了一个全面的解决方案,来处理存储在数据库中的二进制图片数据。...

    图片在数据库中的存取

    图片在数据库中的存取是一个多步骤的过程,涉及数据类型的选择、文件的二进制转换、存储策略以及高效的查询方法。 首先,我们需要了解数据库如何存储非结构化数据如图片。常见的方法有两种:一是将图片文件直接存储...

    C#中word文档、图片以二进流存数据库和从数据库读出并打开

    二进制流(Binary Stream)是数据的一种表示方式,它将文件内容转换为连续的0和1序列,以便于在内存和外部存储设备之间进行传输。在C#中,我们可以使用`System.IO`命名空间下的`FileStream`类来读写二进制流。 1. *...

    如何用Delphi存取Microsoft SQL Server中的图像数据.pdf

    Microsoft SQL Server系统中的BLOB(Binary Large Object,大型二进制对象)数据类型是用于存储多媒体对象(如图像、视频和声音)的主要数据类型,包括text、ntext或image数据类型。其中image数据类型适用于存储变长...

    asp图片添加到数据库的字段中

    这种技术的核心是将图片文件读取为二进制流,然后将这个流存储到数据库中的BLOB(Binary Large Object)类型字段。BLOB字段设计用于存储大对象,如图像、文档等。 描述中提到的"上传图片的信息",指的是用户通过...

    将图片保存到数据库!

    6. **查询和显示图片**:要从数据库中检索图片,同样使用SQL的`SELECT`语句,然后将二进制数据写入到文件或显示出来。在Python中,可以使用`fetchone()`或`fetchall()`获取结果,然后将二进制数据写入到新的文件中。...

    mysql,sqlserver,oracle三种数据库的大对象存取

    在SQL Server中,大对象通常用IMAGE类型表示,它可以存储任意二进制数据。与MySQL类似,我们可以使用PreparedStatement的setBinaryStream方法进行操作。但是,SQL Server的IMAGE类型已在SQL Server 2016中被弃用,...

    VB将图片存入Access数据库并实现导出、删除等操作.7z

    Access数据库虽然主要用于存储结构化数据,如文本、数字等,但通过特定方法,也能处理二进制大型对象(BLOB,Binary Large Object),如图片。本项目通过VB实现的这种功能,为数据库中的图片提供了导入、导出、删除...

    增删改SQL图片

    首先,SQL Server 2008提供了多种方式来存储图像和其他二进制大对象(BLOB)数据,如varbinary(max)或image数据类型。`varbinary(max)`更推荐用于新开发,因为它具有更好的可伸缩性和灵活性。图片数据会被转换为字节...

    VB SQL数据库图片存取.doc

    综上所述,VB结合SQL数据库进行图片存取涉及的主要技术点包括使用ADODB库操作数据库、处理BLOB类型字段以及二进制文件的读写。在实际开发中,还需结合业务需求和规范,确保系统的稳定性和安全性。

    dsf.zip_读取图片

    3. **显示图片**:使用相应的库或API将临时文件中的二进制数据解析为图片。在Web环境中,可以使用HTML和JavaScript,或者在桌面应用中使用GUI库(如Tkinter、wxPython等)来显示图片。 4. **清理资源**:完成显示后...

Global site tag (gtag.js) - Google Analytics