2011-03-14 87 views
1

我试图从MS SQL中的图像日期字段中获取RTF数据。不那么容易。如何将varbinary数据类型转换回MSSQL中的ascii

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

代码把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文本,那么我可以继续我的应用程序。

+1

此代码完整无误吗?这似乎只写出你从行中拉出的@imageBinary。你怎么把它放到行中? – 2011-03-14 14:12:20

回答

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 
+0

这对我来说很好。根本原因是数据实际上不是RTF。它的一些其他奇怪/定制的野兽。但是这对于将二进制数据移入和移出数据库是完全正确的。 – Rob 2011-03-14 17:28:45

+0

我收到此错误:Msg 4861,Level 16,State 1,Line 6 由于无法打开文件“C:\ dev \ testing.rtf”,无法批量加载。操作系统错误代码3(系统找不到指定的路径。)。 配置选项'show advanced options'从1更改为1.运行RECONFIGURE语句进行安装。 配置选项'Ole Automation Procedures'从1更改为1.运行RECONFIGURE语句进行安装。 – 2012-10-09 17:01:03

相关问题