当前位置: 代码网 > it编程>数据库>MsSqlserver > sql server实现图片的存入和读取的流程详解

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

2024年06月13日 MsSqlserver 我要评论
首先提醒一下,无论是将图片存入数据库,还是从数据库中读取,都是采用流的形式进行,虽然,在数据库中,存储图片的类型是image,但是sql中的image和c#中的image不一样,就如同sql中的nul

首先提醒一下,无论是将图片存入数据库,还是从数据库中读取,都是采用流的形式进行,虽然,在数据库中,存储图片的类型是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;
                            }
                        }
                    }
                }
            }
        }
    }
}

到此这篇关于sql server实现图片的存入和读取的流程详解的文章就介绍到这了,更多相关sql server图片存入和读取内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com