我爱Aspx >> C#.Net >> C#中读取数据库中Image数据DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据。但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据,而单个行中无法包含如此多的数据。Command.ExecuteReader 方法具有一个重载,它将采用 CommandBehavior 参数来修改 DataReader 的默认行为。您可以将 CommandBehavior.SequentialAccess 传递到 ExecuteReader 方法来修改 DataReader 的默认行为,以便让 DataReader 按照顺序在接收到数据时立即将其加载,而不是加载数据行。这是加载 BLOB 或其他大数据结构的理想方案。
在将 DataReader 设置为使用 SequentialAccess 时,务必要注意访问所返回字段的顺序。DataReader 的默认行为是在整个行可用时立即加载该行,这使您能够在读取下一行之前按任何顺序访问所返回的字段。但是,当使用 SequentialAccess 时,必须按顺序访问由 DataReader 返回的不同字段。例如,如果查询返回三个列,其中第三列是 BLOB,则必须在访问第三个字段中的 BLOB 数据之前返回第一个和第二个字段的值。如果在访问第一个或第二个字段之前访问第三个字段,则第一个和第二个字段值将不再可用。这是因为 SequentialAccess 已修改 DataReader,使其按顺序返回数据,当 DataReader 已经读取超过特定数据时,该数据将不可用。
当访问 BLOB 字段中的数据时,请使用 DataReader 的 GetBytes 类型化访问器,该访问器将使用二进制数据填充 byte 数组。您可以指定要返回的特定数据缓冲区大小以及从返回的数据中读取的第一个字节的起始位置。GetBytes 将返回 long 值,它表示所返回的字节数。如果向 GetBytes 传递空的 byte 数组,所返回的长值将是 BLOB 中字节的总数。您可以选择将字节数组中的某索引指定为所读取数据的起始位置。
以下示例从 Microsoft SQL Server 中的 pubs 示例数据库中返回发行者 ID 和徽标。发行者 ID (pub_id) 是字符字段,而徽标则是图形,即 BLOB。请注意,由于必须按顺序访问字段,所以将在访问徽标之前访问当前数据行的发行者 ID。
[Visual Basic]
Dim pubsConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;")
Dim logoCMD As SqlCommand = New SqlCommand("SELECT pub_id, logo FROM pub_info", pubsConn)
Dim fs As FileStream ' Writes the BLOB to a file (*.bmp).
Dim bw As BinaryWriter ' Streams the binary data to the FileStream object.
Dim bufferSize As Integer = 100 ' The size of the BLOB buffer.
Ҷƪл˵?
C#编程入门三部曲:第一步 创建一..[05-12]
利用VC# 创作简单的多线程组件[05-12]
Creating GUIDs in c#[05-12]
C#访问接口[05-12]
使用C#开发SmartPhone程序入门[05-12]
CGI教程(7)解码数据发送给CGI脚本..[05-12]
用C#设计Windows应用程序模板[05-12]
用C#编写发手机中文短信息Window..[05-12]
浅析Java与C#的事件处理机制[05-12]
用Visual C#访问DB2数据库[05-12]
为你的CheckBox和RadioButton控件..[05-12]
C#编程入门三部曲:第一步 创建一..[05-12]
利用VC# 创作简单的多线程组件[05-12]
在.NET中实现彩色光标,动画光标..[05-12]
Creating GUIDs in c#[05-12]
C#访问接口[05-12]
使用C#开发SmartPhone程序入门[05-12]
用VC++实现控制程序运行唯一实例[05-12]
创建ActiveX接口移植Excel工作表[05-12]
CGI教程(7)解码数据发送给CGI脚本..[05-12]