C#读出SQL数据库中存储的图片到picturebox 5

C#作WINFORM程序,数据库用SQL1.将图片存入SQL数据库的代码如下:Bitmapbitmap=(Bitmap)pictureBox1.Image;BinaryF... C#作WINFORM程序,数据库用SQL 1.将图片存入SQL数据库的代码如下:
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上,请给出详细的代码,谢谢。
展开
 我来答
th79d
2011-04-02 · TA获得超过265个赞
知道小有建树答主
回答量:203
采纳率:0%
帮助的人:256万
展开全部

这里介绍两种种方法。

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方法。
郏鸿祯C6
2011-04-01 · TA获得超过4549个赞
知道小有建树答主
回答量:1601
采纳率:50%
帮助的人:1199万
展开全部
MemoryStream ms = new MemoryStream(bytes); // MemoryStream创建其支持存储区为内存的流。
//MemoryStream属于System.IO类
ms.Position = 0;
Image img = Image.FromStream(ms);
ms.Close();
this.pictureBox1.Image = img;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pengjianhang
2011-04-01 · TA获得超过296个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:369万
展开全部
http://wenku.baidu.com/view/156f8ced4afe04a1b071de20.html 这里有你要的答案,不过我建议你不要这么做,数据库里只要保存图片路径就好了。

参考资料: http://wenku.baidu.com/view/156f8ced4afe04a1b071de20.html

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式