【发布时间】:2019-11-03 07:05:01
【问题描述】:
我正在使用此代码导出 blob:
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
DECLARE @outout_path varchar(50) = 'D:\blob',
@i bigint,
@init int,
@data varbinary(max),
@file_path varchar(max),
@folder_path varchar(max)
DECLARE @Doctable TABLE (id int identity(1,1) , [FileName] varchar(100), file_data varBinary(max) )
INSERT INTO @Doctable([FileName],file_data)
Select top 10 thefilename, file_data FROM schm.table_with_blobs
SELECT @i = COUNT(1) FROM @Doctable
WHILE @i >= 1
BEGIN
SELECT @data = [file_data],
@file_path = @outout_path + '\'+ cast(id as varchar) + '\' + [FileName],
@folder_path = @outout_path + '\'+ cast(id as varchar)
FROM @Doctable
WHERE id = @i
EXEC [dbo].[CreateFolder] @folder_path
EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT;
EXEC sp_OASetProperty @init, 'Type', 1;
EXEC sp_OAMethod @init, 'Open';
EXEC sp_OAMethod @init, 'Write', NULL, @data;
EXEC sp_OAMethod @init, 'SaveToFile', NULL, @file_path, 2;
EXEC sp_OAMethod @init, 'Close';
EXEC sp_OADestroy @init;
print 'Document Generated at - '+ @file_path
SELECT @data = NULL,
@init = NULL,
@file_path = NULL,
@folder_path = NULL;
SET @i -= 1;
END
所有文件都按预期以正确的文件格式导出。但是,无论文件格式如何,所有文件都已损坏且无法打开。我可以调整什么来避免这种情况?我是否需要更明确地标注文件类型(在thefilename 字段中可用)?
【问题讨论】:
-
尝试验证
schm_table_with_blobs是否确实包含您期望的数据,方法是对应该包含或多或少可读数据的文件类型执行CONVERT(VARCHAR(MAX), file_data)(.txt是理想的,但是.pdf可以在紧要关头做)。此外,使用文本或十六进制编辑器打开导出的文件,查看是否与数据库中的内容匹配。如果问题出在ADODB.Stream的使用或数据本身,这样您就可以缩小范围。 -
@JeroenMostert
.txt在数据库中看起来正常并正确导出(即未损坏)。其他文件类型(例如 PDF、Excel)在数据库中是乱码……在记事本中打开导出的文件时也是一样的乱码。 -
不确定这是否意味着 ADODB 流是问题
标签: sql sql-server blob ole