//数据库获取图片,显示在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(); |
} |