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