如何在MSSQL中将varbinary数据类型转换回ascii

发布于 2024-10-21 20:48:58 字数 1169 浏览 2 评论 0原文

我正在尝试从 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 文件。所以,不知何故,微软正在以一种我无法识别的方式转换它。如果我能弄清楚如何将其转换回 ascii 文本,那么我就可以继续我的应用程序。

I am trying to get RTF data out of a image date field in MS SQL. Not so easy.

The issue is that when I do a straight binary dump of the data field it is not in RTF format.
Let me explain what is going on. When I create a RTF file with Wordpad, and write that data to a varbinary(max), and reconvert it, the result is jiberish.

Code to put RTF data into 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

In binary, the first part of this file goes like this
0x7B 5C 72 74 66 31 5C 61 6E 73 69 5C 61 6E 73 69)
(ascii {\rtf1\ansi\ansi )
However, the varbinary field looks like this:
0xB0 04 01 00 0E 00 00 00 00 00 00 00 00 00 09 00

And when i take that data out of the database (by using the reverse of the procedure above), it is not a recognizable RTF file. So, somehow MS is converting it in a way i can't recognize. If I can figure out how to convert it back to ascii text then I can continue with my application.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寄离 2024-10-28 20:48:58

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

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

The following works for me. I suspect the issue must be how you are saving the file to the database.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文