MySQL数据库之插入显示图片_女汉纸一枚的博客-程序员宅基地

     图书馆系统项目需要用到好多图片,并且要求存入到数据库中,对这个特别感兴趣,于是上网查了资料,采用C#语言,进行了具体实现。


说明:

    功能:往MySQL数据库插入并显示图片;

    验证:执行插入功能后,我把该图片进行了本地的删除,然后执行显示功能,可以显示出来。

    数据库该字段类型:longblob

  • 原型部分

 

  • 数据库



  • 引用部分

 

/*
 * 作者:周丽同
 * 功能:简单实现往MySQL数据库插入显示图片;
 * 日期:2016年6月1日11:32:35
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using MySql.Data;
using MySql.Data.MySqlClient;
using System.Drawing.Imaging;

  • 窗体加载部分

 

        private void Form1_Load(object sender, EventArgs e)
        {
            //获取当前窗体上的picturebox1里面的路径内容或者URL;
            bool flag;
            flag = ImageWrite(pictureBox1.ImageLocation);
            //显示数据库里面存储的图片;
            pictureBox2.Image = MapSearchQuery();
        }

  • 往MySQL数据库插入图片代码

 

/// <summary>
        /// 将图片存入到数据库中
        /// </summary>
        /// <param name="strImagePath"></param>
        /// <returns></returns>
        public bool ImageWrite(string strImagePath)
        {
            //FileStream文件流;此部分需要引用:System.IO;
            FileStream fs = new System.IO.FileStream(strImagePath, FileMode.Open, FileAccess.Read);

            //获得图片字节数组
            byte[] byImage = new byte[fs.Length];
            fs.Read(byImage, 0, byImage.Length);
            fs.Close();

            //数据库连接
            MySqlConnection conn = new MySqlConnection();
            conn.ConnectionString = "Server=localhost;uid=root;password=1;Database=librarysystem;";

            //打开关闭连接
            try
            {
                conn.Open();
            }
            catch
            {
                conn.Close();
                conn.Dispose();
                throw new ArgumentException("检索失败啦!");
            }

            //判断数据库中内部有无记录
            MySqlCommand cmd1 = new MySqlCommand();
            //根据条件查询是否存在图片
            string strQueryCmd = "select * from t_picture";
            MySqlCommand cmdQuery = new MySqlCommand(strQueryCmd, conn);
            MySqlDataReader dataReader = cmdQuery.ExecuteReader();
            bool flag1 = dataReader.Read();
            //关闭连接
            cmd1.Dispose();
            conn.Close();
            conn.Dispose();


            //此处如果涉及到两次对数据库的访问,一定要记得关闭上次的连接,然后再进行接下来对数据库的操作;
            try
            {
                conn.Open();
            }
            catch
            {
                conn.Close();
                conn.Dispose();
                throw new ArgumentException("检索失败啦!");
            }
            //执行更新或插入操作操作
            MySqlCommand cmd = new MySqlCommand();
            if (flag1)    //flag1是上面操心操作的结果
            {
                cmd.CommandText = "update t_picture set picture=@picture";
            }
            else
            {
                cmd.CommandText = "insert into t_picture(picture) values (@picture)";
            }

            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add("@picture", MySqlDbType.LongBlob);
            cmd.Parameters[0].Value = byImage;
            cmd.Connection = conn;

            int affecteRows = 0;//初始化数据库操作的结果;
            try
            {
                affecteRows = cmd.ExecuteNonQuery();//返回对数据库的执行结果;
            }
            catch
            {
                affecteRows  = -1;
            }

            //关闭连接等
            cmd.Dispose();
            conn.Close();
            conn.Dispose();

            if (affecteRows <= 0)
            {
                MessageBox.Show("保存失败!");
                return false;
            }
            else
            {
                MessageBox.Show("保存成功!");
                return true;
            }
        }

  • 查询MySQL数据库存储的图片,并显示代码

/// <summary>
        /// 对MySQL数据库图片进行显示
        /// </summary>
        /// <returns></returns>
        public Image   MapSearchQuery()
        {
            //声明图片数组
             byte[] imageByteResulet;
            imageByteResulet = null;

            //连接数据库
            MySqlConnection conn = new MySqlConnection();
            conn.ConnectionString = "Server=localhost;Uid=root;Password=1;Database=librarysystem;";
            //对数据库进行开关闭
            try
            {
                conn.Open();
            }
            catch
            {
                conn.Close();
                conn.Dispose();
                throw new ArgumentException("图片加载超时啦!");
            }
            //执行查询操作(可以根据具体条件下的图片进行查询显示)
            string strQueryCmd = "select * from t_picture";
            MySqlCommand cmd = new MySqlCommand(strQueryCmd, conn);
            MySqlDataReader dataReader = null;
            try
            {
                dataReader = cmd.ExecuteReader();
            }
            catch
            {
                dataReader.Dispose();
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
                throw new ArgumentException("图片加载超时啦!");
            }

            //声明接收返回值图片
            Image imageResulet;
            if (dataReader.Read())
            {
                //获取数据库中图片字节数组
                imageByteResulet = new byte[dataReader.GetBytes(0, 0, null, 0, int.MaxValue)];
                dataReader.GetBytes(0, 0, imageByteResulet, 0, imageByteResulet.Length);

                 将图片字节数组加载入到缓冲流
                byte[] imageByte = imageByteResulet;
                MemoryStream imageStream = new MemoryStream(imageByte);

                从缓冲流生成图片
                imageResulet = Image.FromStream(imageStream, true);
                return imageResulet;
            }
            else
            {
                imageResulet = null;
            }

            dataReader.Dispose();
            cmd.Dispose();
            conn.Close();
            conn.Dispose();

            return imageResulet;
        }

    个人感觉这个方法不是最简单的,希望路过的大神,提出宝贵意见。


感谢您的宝贵时间···

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zlt995768025/article/details/51554665

智能推荐

【笔记】jq实现长按监听效果_jqery长按监听坐标-程序员宅基地

1、通过jq添加一个封装好的长按监听函数$.fn.longPress = function (fn,trsTime) {//长按监听 var $this = this; for (var i = 0; i < $this.length; i++) { (function (target) { var timeout; target.addEventListener(..._jqery长按监听坐标

【转】多进程oracle实例进程中各后台进程的作用-程序员宅基地

1、DBWR进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个Oracle后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,DBWR将管理缓...

c++,stl,线性容器vector,string,容量capacity只大不小,占用太多内存的解决方法,拷贝构造函数配合swap函数交换容器,释放多的容量内存_c++ vector size 很大-程序员宅基地

c++,stl,线性容器vector,string,容量capacity只大不小,占用太多内存的解决方法,拷贝构造函数配合swap函数交换容器,释放多的容量内存在线性容器vector中,容量只会增大不会减小,这导致vector容器会一直占用其“数据量最大值”时的内存,造成了内存资源的浪费。问题:线性容器vector容量只增不减带来内存浪费。解决方式,初级:1、通过vector容器的拷贝构造函数,以一个需要被缩容的容器为数据,拷贝构造一个新容器。2、被拷贝构造出的vector容器的容量capaci_c++ vector size 很大

关于NVIDIA显卡驱动更新后,没有NVIDIA 控制面板的解决办法_新版英伟达驱动没有控制面板了 csdn-程序员宅基地

记最近在进行GPU并行计算遇到的问题。在驱动精灵更新N卡驱动后,NVIDIA Control Panel 消失不见了。在网上查了很多解决办法,经过多日的尝试后终于找到能解决我问题的方法。方法就是从Microsoft Store下载,关键就是无法下载N卡控制面板,出现应用商店下载 错误代码:0x80073D21 。我在Microsoft 支持中找到了答案。官方给出的解决办法:1、调整网络连接1.1 如果您连接了 VPN 或下载了第三方防火墙应用,建议断开 VPN,卸载第三方防火墙应用。建议您暂_新版英伟达驱动没有控制面板了 csdn

〖大前端 - 基础入门三大核心之 html 篇⑰〗- HTML篇内容总结_html大前端-程序员宅基地

HTML的内容就先学到这里,实际项目过程中,我们使用到的并不只有这些知识,但没关系,我们先掌握了这些基础知识,明白了HTML脚本编写的规律,然后多加练习,自然会熟能生巧,举一反三。_html大前端

JDK和Tomcat官网下载,包含各个历史版本_jdk各版本下载-程序员宅基地

tomcat官网下载:http://tomcat.apache.org/ jdk官网下载:http://www.oracle.com/technetwork/java/javase/archive-139210.html_jdk各版本下载

随便推点

C++ SOCKET通信模型(五)poll_windows poll-程序员宅基地

在windows上绕了一大圈之后终于又回到linux,主要就说下poll和epoll。从这两个模型上可以看出,linux始终都没有采取将内核的收到数据直接拷贝到用户缓冲区,epoll用了更加灵活的办法:mmap,这么做可能是为了让开发人员去处理传输过程中的问题,比如像传输缓慢之类的处理策略。poll和select用起来非常相似,但select每次循环都要清空重设内核对象,poll通过标识的办法避免_windows poll

用python实现日历(1800年前后)_python日期为啥是1800年开始-程序员宅基地

'''*实现日历的查询'''def main(): year=eval(input("Enter full year(e.g.,2001)")) #month=eval(input("Enter month as number between 1 and 12")) for i in range(1,13): printMonth(year,i) ..._python日期为啥是1800年开始

开发随笔-学习c++的思考,没有mfc,该怎么做??_rad studio direct ui-程序员宅基地

因为最近项目的原因,这段时间特意把c++的书翻了出来,开始恢复c++了。c++因为在学校学习的时候感觉很困难,这也是我毕业后选择.net的原因之一了。因为项目是在windows下开发,主要是虚拟现实方面的应用,主要就是利用vc++ mfc跟虚拟现实软件 virtools sdk打交道。毕竟以前用过c++,恢复起来还是比较快的。c++基础->>windows32 api编程->>vc++ mfc,找_rad studio direct ui

Labview学习之程序Web发布-程序员宅基地

Labview学习之程序Web发布

redis服务安装卸载_redis服务安装卸载脚本-程序员宅基地

1.windows安装redis服务器以管理员的身份运行cmd命令行进入安装路径并执行:redis-server --service-install redis.windows.conf执行成功后可在服务里看到redis服务2.windows卸载redis服务器以管理员的身份运行cmd命令行进入安装路径并执行:redis-server --service-un..._redis服务安装卸载脚本

推荐文章

热门文章

相关标签