【问题标题】:How do I retreive a file from FILESTREAM?如何从 FILESTREAM 中检索文件?
【发布时间】: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


【解决方案1】:

了解 SQL Server 的权限将解决 SaveToFile 问题。就我而言,我将 SavetoFile 目录更改为 C:\temp。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多