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

原创 2004年10月25日 19:56:00
作者:未知 请与本人联系

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.

Dim outbyte(bufferSize - 1) As Byte ' The BLOB byte() buffer to be filled by GetBytes.

Dim retval As Long ' The bytes returned from GetBytes.

Dim startIndex As Long = 0 ' The starting position in the BLOB output.


Dim pub_id As String = "" ' The publisher id to use in the file name.


' Open the connection and read data into the DataReader.

pubsConn.Open()

Dim myReader As SqlDataReader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess)


Do While myReader.Read()

' Get the publisher id, which must occur before getting the logo.

pub_id = myReader.GetString(0)


' Create a file to hold the output.

fs = New FileStream("logo" & pub_id & ".bmp", FileMode.OpenOrCreate, FileAccess.Write)

bw = New BinaryWriter(fs)


' Reset the starting byte for a new BLOB.

startIndex = 0


' Read bytes into outbyte() and retain the number of bytes returned.

retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)


' Continue reading and writing while there are bytes beyond the size of the buffer.

Do While retval = bufferSize

bw.Write(outbyte)

bw.Flush()


' Reposition the start index to the end of the last buffer and fill the buffer.

startIndex = startIndex + bufferSize

retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)

Loop


' Write the remaining buffer.

bw.Write(outbyte)

bw.Flush()


' Close the output file.

bw.Close()

fs.Close()

Loop


' Close the reader and the connection.

myReader.Close()

pubsConn.Close()

[C#]

SqlConnection pubsConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;");

SqlCommand logoCMD = new SqlCommand("SELECT pub_id, logo FROM pub_info", pubsConn);


FileStream fs; // Writes the BLOB to a file (*.bmp).

BinaryWriter bw; // Streams the BLOB to the FileStream object.


int bufferSize = 100; // Size of the BLOB buffer.

byte[] outbyte = new byte[bufferSize]; // The BLOB byte[] buffer to be filled by GetBytes.

long retval; // The bytes returned from GetBytes.

long startIndex = 0; // The starting position in the BLOB output.


string pub_id = ""; // The publisher id to use in the file name.


// Open the connection and read data into the DataReader.

pubsConn.Open();

SqlDataReader myReader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess);


while (myReader.Read())

{

// Get the publisher id, which must occur before getting the logo.

pub_id = myReader.GetString(0);


// Create a file to hold the output.

fs = new FileStream("logo" + pub_id + ".bmp", FileMode.OpenOrCreate, FileAccess.Write);

bw = new BinaryWriter(fs);


// Reset the starting byte for the new BLOB.

startIndex = 0;


// Read the bytes into outbyte[] and retain the number of bytes returned.

retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);


// Continue reading and writing while there are bytes beyond the size of the buffer.

while (retval == bufferSize)

{

bw.Write(outbyte);

bw.Flush();


// Reposition the start index to the end of the last buffer and fill the buffer.

startIndex+= bufferSize;

retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize);

}


// Write the remaining buffer.

bw.Write(outbyte);

bw.Flush();


// Close the output file.

bw.Close();

fs.Close();

}


// Close the reader and the connection.

myReader.Close();

pubsConn.Close();
 
 
    
版权声明:本文为博主原创文章,未经博主允许不得转载。

.Net读取数据库中的图片并显示

         从数据库中读取二进制图片很简单,这里不写代码了,读出来是一个Object,要想显示再界面上,需要先转换成byte[]数组,然后读入一个Stream中,再调用Image.FromStr...
  • Red_angelX
  • Red_angelX
  • 2006年11月07日 16:59
  • 2369

C#用LINQ to SQL把PictureBox中的图片存入数据库和取出数据库中的图片并显示在PictureBox中

最近在做一个项目需要用LINQ to SQL把图片存如数据库并且取出数据库,在晚上找了很多资料,大多都是用ADO.NET,感觉ADO.NET有点麻烦,所以没采用,最后研究了下LINQ to SQL,发...
  • dfgdgdjg
  • dfgdgdjg
  • 2014年02月21日 20:04
  • 1062

C#将图片保存到数据库字段并反向读取

在.Net程序中有时候需要生成和存储一些图片,当需要的时候供程序调用。做法有很多,其中常用的一种是将图片存储在本地,需要的时候去本地查找,这种方法实现简单,方便查看。但是随着程序运行时间的增长,会产生...
  • guonan198811
  • guonan198811
  • 2016年05月09日 22:23
  • 702

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

作者:未知 请与本人联系DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据。但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据,而...
  • 21aspnet
  • 21aspnet
  • 2004年10月25日 19:56
  • 2174

向数据库读写image文件

题记:其实已经很久没动asp了,最近有不少人都在问这个问题正好已经写好这个东东,于是贴出来,希望对一部分仍在用asp的网友有所帮助用asp向SQLServer数据库读写image文件一、发送image...
  • aloesky
  • aloesky
  • 2005年06月30日 09:27
  • 944

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

DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据。但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据,而单个行中无法包含如此多的...
  • ehung
  • ehung
  • 2006年08月12日 18:08
  • 779

C#从SQL server数据库中读取l图片和存入图片

转自:http://www.cnblogs.com/hfzsjz/archive/2010/05/21/1740778.html 本实例主要介绍如何将图片存入数据库。将图片存入数据库,首先要在数...
  • chelen_jak
  • chelen_jak
  • 2015年11月23日 12:17
  • 2572

读取数据库Image格式图片并显示

DataSet ds = bll.GetList("");             byte[] MyData= new byte[0];               int PicCount ...
  • p419228530
  • p419228530
  • 2011年08月10日 18:34
  • 667

C#从SQL_数据库中读取和存入图片

  • 2014年12月24日 10:00
  • 77KB
  • 下载

C#关于sqlserver中读取image类型

今天在网上找了许久关于sqlserver中存储image类型和读取image的方法,可是都是那么一点,故在此罗列一下,希望可以帮助大家。首先是关于dataGridView的绑定。代码见下 privat...
  • wanghaofeng
  • wanghaofeng
  • 2010年05月23日 23:37
  • 8293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中读取数据库中Image数据
举报原因:
原因补充:

(最多只允许输入30个字)