2011-03-14 88 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

相關問題