C#中读取数据库中Image数据

C#中读取数据库中Image数据,第1张

C#中读取数据库中Image数据,第2张

DataReader的默认行为是,一旦整个数据行可用,就将传入的数据作为一行加载。但是,二进制大型对象(BLOB)需要区别对待,因为它们可能包含数十亿字节的数据,但一行不能包含这么多数据。命令。ExecuteReader方法有一个重载,该重载将采用CommandBehavior参数来修改DataReader的默认行为。您可以通过将command behavior . sequential access传递给ExecuteReader方法来修改DataReader的默认行为,以便DataReader可以在按顺序接收数据后立即加载数据,而不是加载数据行。这是加载BLOB或其他大数据结构的理想解决方案。

将DataReader设置为使用SequentialAccess时,一定要注意访问返回字段的顺序。DataReader的默认行为是在整行可用时立即加载整行,这使您能够在读取下一行之前以任意顺序访问返回的字段。但是,使用SequentialAccess时,必须按顺序访问DataReader返回的不同字段。例如,如果查询返回三列,其中第三列是BLOB,则在访问第三个字段中的BLOB数据之前,必须返回第一个和第二个字段的值。如果在访问第一个或第二个字段之前访问第三个字段,则第一个和第二个字段值将不再可用。这是因为SequentialAccess修改了DataReader,使其按顺序返回数据,当DataReader读取的数据超过特定数据时,数据将不可用。

当访问BLOB字段中的数据时,使用DataReader的GetBytes类型化访问器,该访问器将用二进制数据填充字节数组。您可以指定要返回的特定数据缓冲区大小以及从返回数据中读取的第一个字节的起始位置。GetBytes将返回一个long值,表示返回的字节数。如果将空的字节数组传递给GetBytes,则返回的长整型值将是BLOB中的总字节数。您可以选择在字节数组中指定一个索引作为读取数据的起始位置。

以下示例从Microsoft SQL Server中的pubs示例数据库返回出版商ID和徽标。发布者ID (pub_id)是一个字符字段,而徽标是一个图形,即一个BLOB。请注意,由于必须按顺序访问这些字段,因此将在访问徽标之前访问当前数据行的发布者ID。

[Visual Basic]
Dim pubs conn As SqlConnection = New SqlConnection(" Data Source = localhost;综合安全= SSPI;初始目录=酒馆;”)
Dim logo cmd As SqlCommand = New SqlCommand(" SELECT pub _ id,logo FROM pub_info ",pubsConn)

“Dim fs As FileStream”将BLOB写入文件(*。bmp)。
Dim bw As BinaryWriter '将二进制数据传输到FileStream对象。

dim buffer size As Integer = 100 ' BLOB缓冲区的大小。
Dim out Byte(buffer size-1)As Byte '要由GetBytes填充的BLOB byte()缓冲区。
Dim retval As Long '从GetBytes返回的字节数。
Dim startIndex As Long = 0 ' BLOB输出中的开始位置。

Dim pub_id As String = " "要在文件名中使用的发布者id。

打开连接并将数据读入DataReader。
pubsConn。open()
Dim my reader As sqldata reader = logo cmd。ExecuteReader(CommandBehavior。顺序访问)

在我朗读的时候做。Read()
'获取发布者id,该id必须在获取徽标之前出现。
pub_id = myReader。GetString(0)

创建一个文件来保存输出。
fs = New FileStream(" logo " & pub _ id & "。bmp ",文件模式。OpenOrCreate,FileAccess。Write)
bw =新的二进制编写器(fs)


重置新BLOB的起始字节。
startIndex = 0

将字节读入outbyte()并保留返回的字节数。
retval = myReader。GetBytes(1,startIndex,outbyte,0,bufferSize)

当有超过缓冲区大小的字节时,继续读写。
Do While retval = buffer size
bw。写(outbyte)
bw。齐平()

将起始索引重新定位到最后一个缓冲区的末尾,并填充该缓冲区。
startIndex = startIndex+buffer size
retval = my reader。GetBytes(1,startIndex,outbyte,0,buffer size)
循环

写入剩余的缓冲区。
bw。写(outbyte)
bw。齐平()

关闭输出文件。
bw。Close()
fs。close()
循环

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#中读取数据库中Image数据

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情