在sql server中实现图片的存入和读取

首先提醒一下,无论是将图片存入数据库,还是从数据库中读取,都是采用流的形式进行,虽然,在数据库中,存储图片的类型是Image,但是sql中的Image和C#中的Image不一样,就如同sql中的null的判断在C#中得用DBNULL来判断


先看窗体设计,很简单,一共就五个控件,名字都没改,pictureBox1,textBox1,button1,button2,button3(依次从上到下,从左到右),看源码的时候会看到的
在这里插入图片描述
数据库中表的设计
就一个Image
在这里插入图片描述

首先程序运行,可以先选择一张图片
文本框中是图片在本地磁盘上的路径,在此掩盖部分
在这里插入图片描述

然后点击,存入数据库
提示存入成功
在这里插入图片描述

在此,将窗体关闭,重新打开,读取图片。
至于为什么这么做看到源码就知道了

重新打开后的
在这里插入图片描述

点击从数据库中读取按钮
拿到了刚才存入的图片
在这里插入图片描述

源码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 读取数据库中的图片
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 选择图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //初始化打开文件 对话框
            OpenFileDialog ofdlgTest = new OpenFileDialog();
            ofdlgTest.Filter = "*.jpg|*.png";   //文件过滤 筛选可以打开的文件
            ofdlgTest.Multiselect = false;    //设置不可以选择多个文件

            //显示文件打开对话框
            DialogResult result = ofdlgTest.ShowDialog();
            
            //选择打开按钮的时候,将文件名显示到文本框中
            if (result== DialogResult.OK)                   //判断是否打开文件
            {
                this.textBox1.Text = ofdlgTest.FileName;

                pictureBox1.Image = Image.FromFile(ofdlgTest.FileName);
            }
        }

        /// <summary>
        /// 存入数据库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string constr = "Data Source=.;Initial Catalog=MyFirstDatabase;User Id=sa;PassWord=91811372c";

            using(SqlConnection con=new SqlConnection(constr))
            {
                //sql语句  插入图片
                string sql = "insert into ImageTest values(@UserImage)";
                using(SqlCommand com=new SqlCommand(sql,con))
                {
                    byte[] buffer;   //将图片转换为字节数组 存入数据库   textBox1.Text 是文件的路径
                    using(FileStream stream = new FileStream(textBox1.Text, FileMode.OpenOrCreate, FileAccess.Read))
                    {
                        //通过文件路径 打开文件
                        buffer = new byte[stream.Length];
                        stream.Read(buffer, 0, buffer.Length);  //转换后 ,存入buffer中
                    }

                    //这个参数 其实 也没必要声明 不过习惯使用 带参数的sql语句了 
                    SqlParameter pms = new SqlParameter("@UserImage", SqlDbType.Image) { Value = buffer };
                    com.Parameters.Add(pms);
                    con.Open();
                    string msg = com.ExecuteNonQuery()>0?"存入成功":"存入失败";
                    MessageBox.Show(msg);
                }
            }
        }

        /// <summary>
        /// 从数据库中读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            string conStr = "Data Source=.;Initial Catalog=MyFirstDatabase;User Id=sa;PassWord=自己的密码";
            using(SqlConnection con=new SqlConnection(conStr))
            {
                //sql语句
                string sql = "select * from ImageTest";
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    con.Open();

                   
                   using(SqlDataReader reader=com.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            //声明一字节数组   将数据库中的图片现存入字节数组中
                            byte[] imageByte;
							//在这我是知道里面就一张图,所以这么写的,个人根据实际情况,可做修改
                           while(reader.Read())
                            {
                                //将图片转换为字节数组
                                imageByte = (byte[])reader["UserImage"];

                                //转换为文件流
                                MemoryStream stream = new MemoryStream(imageByte);
                                //再将文件流 转换为 图像
                                Bitmap bitmap = new Bitmap(stream);
                                pictureBox1.Image = bitmap;
                            }
                        }
                    }
                }
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章