C#读出SQL数据库中存储的图片到picturebox 5
Bitmap bitmap = (Bitmap)pictureBox1.Image;
BinaryFormatter binaryFormatter = new BinaryFormatter();
MemoryStream memoryStream = new MemoryStream();
binaryFormatter.Serialize(memoryStream, bitmap);
byte[] byteArr = memoryStream.ToArray();
bitmap.Dispose();
memoryStream.Dispose();
已经把图片存储到SQL数据库中了,现在是不知道用SqlDataReader 怎样将存储入SQL数据库的图片显示到picturebox上,请给出详细的代码,谢谢。 展开
这里介绍两种种方法。
1,SqlDataReader的GetSqlBytes方法用于检索varbinary(max)列的内容。
reader = command.ExecuteReader(CommandBehavior.SequentialAccess);
while (reader.Read())
SqlBytes bytes = reader.GetSqlBytes(0);
例1从NorthWind数据库的Employees表读取雇员图像并显示。SqlDataReader的GetSqlBytes方法返回一个SqlBytes对象,该对象公开Stream属性。使用该属性创建新的Bitmap对象,然后以Gif ImageFormat格式保存到Stream。
private void ReadPhoto(string lastName) //读取雇员图像并显示
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
Stream s = new MemoryStream(); //创建一个以内存为后备存储的流
SqlCommand command = connection.CreateCommand();
SqlDataReader reader = null;
try
{
command.CommandText = "SELECT LastName,Photo FROM dbo.Employees " +
" WHERE LastName=@LastName";
command.CommandType = CommandType.Text;
//声明参数并赋值
SqlParameter parameter = new SqlParameter("@LastName", SqlDbType.NVarChar, 20);
parameter.Value = lastName;
command.Parameters.Add(parameter);
connection.Open();
//修改DataReader的默认行为,SequentialAccess按顺序接收数据并立即加载
//CloseConnection指明关闭DataReader时,对数据库的连接也关闭
reader = command.ExecuteReader(
CommandBehavior.SequentialAccess|CommandBehavior.CloseConnection);
if (reader.HasRows)
{
while (reader.Read())
{
//SequentialAccess要求按顺序接收数据,先接受reader[0]
this.label1.Text = reader[0].ToString();
if (reader.IsDBNull(1)) //若列值为空返回
return;
else
{
//使用reader.GetSqlBytes获取图像数据
SqlBytes bytes = reader.GetSqlBytes(1);
using (Bitmap productImage = new Bitmap(bytes.Stream))
{
//以gif格式保存在Stream流并显示
productImage.Save(s, System.Drawing.Imaging.ImageFormat.Gif);
this.pictureBox1.Image = System.Drawing.Image.FromStream(s);
} } }
}
else
MessageBox.Show("No records returned.");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Finally
{
if (reader != null)
reader.Dispose(); //关闭DataReader,同时关闭对数据库连接
}
s.Close(); //关闭流
}
}
本程序将DataReader设置为SequentialAccess,要求顺序访问字段,所以先读取LastName小数据,再读取图像大数据。程序运行后从组合框选取雇员的LastName,将在图形框出现雇员的图像,
2,SqlDataReader的GetSqlBinary方法可用于检索varbinary(max)列的内容。
reader = command.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
SqlBinary binaryStream = reader.GetSqlBinary(0);
例2 AdventureWorks2008数据库中的Production.ProductPhoto表含有图形列LargePhoto,数据类型是varbinary(max),可空。用GetSqlBinary方法检索图形数据的代码如下:
private void ReadPhoto(int documentID) //输入参数documentID是产品ID
{
using (SqlConnection connection = new SqlConnection(GetConnectionString()))
{
this.label1.Text = documentID.ToString();
try
{
string queryString = "SELECT LargePhoto FROM Production.ProductPhoto " +
"WHERE ProductPhotoID=@ProductPhotoID";
SqlCommand command = new SqlCommand(queryString, connection);
SqlParameter paramID = new SqlParameter("@ProductPhotoID", SqlDbType.Int);
paramID.Value = documentID;
command.Parameters.Add(paramID);
connection.Open();
//修改DataReader的默认行为
SqlDataReader reader = command.ExecuteReader(
CommandBehavior.SequentialAccess|CommandBehavior.CloseConnection);
if (reader.HasRows)
{
while (reader.Read())
{
if (reader.IsDBNull(0))
return;
else
{
Stream s = new MemoryStream();
SqlBinary binaryStream = reader.GetSqlBinary(0);
//根据SqlBinary值初始化SqlBytes类的新实例
SqlBytes bytes = new SqlBytes(binaryStream);
using (Bitmap productImage = new Bitmap(bytes.Stream))
{
//用gif格式保存图形
productImage.Save(s, System.Drawing.Imaging.ImageFormat.Gif);
this.pictureBox1.Image = System.Drawing.Image.FromStream(s);
}
s.Close();
} }
}
else
MessageBox.Show("No records returned.");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} }
}
下图为documentID=100的自行车类型
以上示例取自C#编程指南但尧编著清华大学出版社2011年1月
谢谢你的回答 但请看好我写出的条件
你的条件不是用SqlDataReader读出图像数据并用PictureBox显示吗?至于如何写进去的不用考虑吧。我写的两个方法都是用SqlDataReader类读出的,一个是用SqlDataReader的GetSqlBytes方法,另一个是GetSqlBinary方法。
//MemoryStream属于System.IO类
ms.Position = 0;
Image img = Image.FromStream(ms);
ms.Close();
this.pictureBox1.Image = img;
参考资料: http://wenku.baidu.com/view/156f8ced4afe04a1b071de20.html