//数据库获取图片,显示在PictureBox控件中。
|
private void btnReadPhoto_Click(object sender, EventArgs e) |
{ |
//创建数据库连接对象
|
SqlConnection conn = new
SqlConnection(ConnectionConfig.getConnectionString2()); |
//组织SQL语句
|
string strSql = "Select stuPhoto from stuInfo Where stuNo
=‘QST001‘"; |
//创建Command命令对象
|
SqlCommand comm = new SqlCommand(); |
//设置Command的连接对象
|
comm.Connection = conn; |
//设置Command要执行的SQL语句
|
comm.CommandText = strSql; |
//打开连接
|
conn.Open(); |
//执行SQL语句,并返回SqlDataReader对象获取查询信息,参数表示:提供一种方法,以便 DataReader 处理包含带有大二进制值的列的行。
|
SqlDataReader reader =
comm.ExecuteReader(CommandBehavior.SequentialAccess); |
|
StringBuilder strResult = new StringBuilder(); |
//读取数据流
|
while (reader.Read()) |
{ |
//设置字节缓存大小
|
int buffersize = 100; |
//设置读取二进制的字节索引位置
|
int startindexer = 0; |
//设置读取字节数
|
long retval; |
//创建缓冲字节
|
Byte[] buffer = new Byte[buffersize]; |
//创建内存流,将图片信息读取到内存中保存
|
MemoryStream ms=new MemoryStream(); |
//调用GetBytes()方法读取图片的信息,参数分别表示:
|
//列序号; |
//字段中的索引,从其开始读取操作;
|
//要将字节流读入的缓冲区;
|
//buffer 中写入操作开始位置的索引;
|
//要复制到缓冲区中的最大长度。
|
//返回值表示:读取的实际字节数
|
retval = reader.GetBytes(0, startindexer, buffer, 0, buffersize); |
//继续读取信息,每次读取100字节,指导实际读取字节不是100字节为止
|
while (retval == buffersize) |
{ |
//将字节信息写于内存流中,在内存中存放图片的二进制信息
|
ms.Write(buffer, 0, buffersize); |
|
ms.Flush(); |
|
startindexer += buffersize; |
//读取数据库中的二进制图片信息,每次读取100字节
|
retval = reader.GetBytes(0, startindexer, buffer, 0, buffersize); |
} |
|
ms.Write(buffer, 0, (int)retval ); |
ms.Flush(); |
|
|
//将内存流中的图片二进制信息,生成Bitmap图片对象
|
Bitmap image = new Bitmap(ms); |
//在图片框控件中,显示内存中的图片信息
|
this.picPhoto.Image = image; |
|
//关闭内存流
|
ms.Close(); |
|
} |
|
//关闭SqlDataReader数据流
|
reader.Close(); |
//关闭连接
|
conn.Close(); |
} |