【发布时间】:2020-04-14 05:02:59
【问题描述】:
我已经在我的机器上安装了 SQL Server Express,并启用并配置了 FILESTREAM 以从 SQL Server 存储和检索 pdf。我已经成功地将文件作为 BLOB 上传到我的表中,但我很难检索它们。我的方法是使用一个临时目录来创建文件,以便我可以打开它们。我有以下代码:
我已经配置了ole自动化
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
我的表 BusinessFiles 中有以下记录:
FileID 415578C7-B058-49A5-A1E4-5A4E7218EA19
InvoiceID 99999
FileName file1
FileType pdf
ImageFile 0x255044462D312…
下一段代码显然将从文件流创建文件。
DECLARE
@FILE VARBINARY(MAX)
,@FILEPATH VARCHAR(MAX)
,@ObjectToken INT
,@FileType VARCHAR(MAX)
,@FILENAME VARCHAR(MAX)
Set @FILENAME = (SELECT [FileName] FROM BusinessFiles where FileID = '415578C7-B058-49A5-A1E4-5A4E7218EA19')
Set @FileType = (SELECT FileType FROM BusinessFiles where FileID = '415578C7-B058-49A5-A1E4-5A4E7218EA19')
SELECT @FILE = ImageFile FROM BusinessFiles where FileID = '415578C7-B058-49A5-A1E4-5A4E7218EA19'
Set @FILEPATH = CONCAT('C:\Users\user\Desktop\', @FILENAME,'.',@FileType)
EXEC sp_OACREATE 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod @ObjectToken, 'Open'
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @FILE
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FILEPATH, 2
EXEC sp_OAMethod @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken
Go
此代码运行,我收到命令已成功完成消息。但是我的文件夹 C:\Users\user\Desktop 中没有任何内容。有什么我想念的吗?谢谢;
我已经验证文件路径是正确的,并且所有的设置都很好。
【问题讨论】:
-
你没有检查你执行的函数的返回值。
-
如何查看sp的返回值?一个选择?
-
例如
DECLARE @hr INT; DECLARE @object_token INT; EXEC @hr=sp_OACreate 'ADODB.Stream', @object_token OUTPUT; IF @hr<>0 PRINT 'fail';。 OLE 函数返回一个 HRESULT 值。如果不为 0,则您的函数失败。 -
好的,这个 SavetoFile 函数失败了...但是路径是正确的...当我选择生成的文件路径时,它的拼写都正确,我可以在我的 PC 中导航到它...
-
您的数据库引擎当然需要能够访问该文件夹,这意味着它只能访问数据库服务器本身上的文件夹,而且它必须具有在那里执行文件操作的权限。
标签: sql-server tsql ssms filestream ole-automation