1

我正在尝试从 MS SQL 中的图像日期字段中获取 RTF 数据。没那么容易。

问题是,当我对数据字段进行直接二进制转储时,它不是 RTF 格式。
让我解释一下发生了什么。当我使用写字板创建一个 RTF 文件并将该数据写入 varbinary(max) 并重新转换时,结果是乱码。

将 RTF 数据放入 MS SQL 的代码:

exec master..sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
exec master..sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
DECLARE @objStream INT
DECLARE @imageBinary VARBINARY(MAX)
DECLARE @filePath VARCHAR(8000)

select @imageBinary=Report from Mytable WHERE EncounterID=7
select @filePath='c:\temp\report.rtf'
EXEC sp_OACreate 'ADODB.Stream', @objStream OUTPUT
EXEC sp_OASetProperty @objStream, 'Type', 1
EXEC sp_OAMethod @objStream, 'Open'
EXEC sp_OAMethod @objStream, 'Write', NULL, @imageBinary
EXEC sp_OAMethod @objStream, 'SaveToFile', NULL,@filePath, 2
EXEC sp_OAMethod @objStream, 'Close'
EXEC sp_OADestroy @objStream

在二进制文件中,该文件的第一部分如下所示 0x7B 5C 72 74 66 31 5C 61 6E 73 69 5C 61 6E 73 69) (ascii {\rtf1\ansi\ansi ) 但是,varbinary 字段如下所示:0xB0 04 01 00 0E 00 00 00 00 00 00 00 00 00 09 00

当我从数据库中取出该数据时(通过使用与上述过程相反的过程),它不是可识别的 RTF 文件。因此,MS 以某种我无法识别的方式对其进行了转换。如果我能弄清楚如何将其转换回 ascii 文本,那么我可以继续我的应用程序。

4

1 回答 1

0

以下对我有用。我怀疑问题一定是您如何将文件保存到数据库中。

CREATE TABLE #BlobTest
(
blob varbinary(max) 
)

INSERT INTO
    #BlobTest (blob)
SELECT  BulkColumn FROM Openrowset( 
      Bulk 'C:\testing.rtf', 
      SINGLE_BLOB) AS blob

GO

exec master..sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
exec master..sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
DECLARE @objStream INT
DECLARE @imageBinary VARBINARY(MAX)
DECLARE @filePath VARCHAR(8000)

select @imageBinary=blob from #BlobTest
select @filePath='c:\report.rtf'
EXEC sp_OACreate 'ADODB.Stream', @objStream OUTPUT
EXEC sp_OASetProperty @objStream, 'Type', 1
EXEC sp_OAMethod @objStream, 'Open'
EXEC sp_OAMethod @objStream, 'Write', NULL, @imageBinary
EXEC sp_OAMethod @objStream, 'SaveToFile', NULL,@filePath, 2
EXEC sp_OAMethod @objStream, 'Close'
EXEC sp_OADestroy @objStream
于 2011-03-14T15:02:44.843 回答