11
2024
09
10:57:25

sql server实现图片的存入和读取的流程详解

sql server实现图片的存入和读取的流程详解


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

先看窗体设计,很简单,一共就五个控件,名字都没改,pictureBox1,textBox1,button1,button2,button3(依次从上到下,从左到右),看源码的时候会看到的

数据库中表的设计

就一个Image

首先程序运行,可以先选择一张图片

文本框中是图片在本地磁盘上的路径,在此掩盖部分

然后点击,存入数据库

提示存入成功

在此,将窗体关闭,重新打开,读取图片。

至于为什么这么做看到源码就知道了

重新打开后的

点击从数据库中读取按钮

拿到了刚才存入的图片

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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;
                            }
                        }
                    }
                }
            }
        }
    }
}

到此这篇关于sql server实现图片的存入和读取的流程详解的文章就介绍到这了




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://www.hqyman.cn/post/7942.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: