c#+oracle实现读取图片并显示在picturebox中

版权声明:本文为博主原创文章,转载需注明出处 https://blog.csdn.net/skytruine/article/details/71530135


      废话不多说,先上结果图。

    最近做某旅游系统,需要一个窗口来显示旅游景点的信息。主要内容包括名称、图片和描述。系统的数据库是位于阿里云服务器上的oracle,系统是用c#开发的winform应用。在数据显示这一部分,很重要的一个问题就是图片应该用什么样的方法存储?从网上看了诸多博客,发现主要有以下四种方法:

    ①把图片直接以blob的类型存在Oracle数据库中,再调用;

    ②把图片放在本地,和应用程序一起打包,在oracle中存图片的相对路径;

    ③手动把图片放在数据库所在的服务器上,在oracle中存对应的URL;

    ④直接调用网络图片,只在oracle中存网络图片的URL;

    事实上,③和④的原理是一致的,都是调用服务器(网络)资源。考虑到②会使得客户端软件较大,①是一种对数据库资源的浪费且我们需要的图片可能随时更换。因此,我们考虑采用第④种方法来实现。

    STEP 1: 建立数据库(如何连接远程数据库我这里就不赘述了)

    不论是用sqlserver还是命令行的方式,总之先把表给建立起来。


        注意URL用变长字符串类型VARCHAR2来存,大小设置的稍微大一些。图片的URL是在网上找,可以通过度娘或google来搜,注意,要把搜出来的图片单独拖出来形成一个网页看它的URL,这个才是这图片真正的URL。

    STEP 2: 编码

    有几个值得注意的点

    ①数据库连接与sql执行

    不论是什么sql servermysql还是我们这里用的oracle,在.net框架下他们的操作都采用ADO.NET技术。基本步骤都是:连接数据库->定义操作->执行操作->返回并读取数据。

    使用oracle数据库的时候,注意一下,首先要设置项目属性中的目标平台为x64,然后设置项目框架为.NET framework 4

   

     记得添加相关引用:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OracleClient;
using System.IO;

    下面是oracle数据库操作部分的代码


//连接数据库
            string connString;
            OracleConnection conn;
            OracleCommand cmd;
            connString = "data source=120.24.97.173/orcl;User Id=system;Password=000000;";//这里密码我已经改过了
            conn = new OracleConnection(connString);
            cmd = conn.CreateCommand();
            try
            {
                conn.Open();
                //MessageBox.Show("成功连接数据库");
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("数据库连接异常");

            }
            string sqlString;

//读取景点名称
            sqlString = @"select name from test_picture 
                        where NO=1";
            cmd.CommandText = sqlString;
            this.textBox2.Text=cmd.ExecuteScalar().ToString();

            //读取景点描述
            sqlString = @"select describe from test_picture 
                        where NO=1";
            cmd.CommandText = sqlString;
            this.textBox1.Text = cmd.ExecuteScalar().ToString();

//读取网络图片url
            string urlString;
            sqlString = @"select picture from test_picture 
                        where NO=1";
            cmd.CommandText = sqlString;
            urlString = cmd.ExecuteScalar().ToString();

     ②通过网络图片的URL读取图片显示在picturebox

     使picturebox显示图片一般有三种方式:

    (1picturebox1.image= Image xxx:把一个Image对象赋值给picturebox;

    (2picturebox1.Load(string url):通过url进行图片的直接加载;

    (3picturebox1.LoadAsync(string url):通过url进行图片的异步加载。

    考虑到我们从数据库中获得的是图片的url,因此方法应该在23中选择。这里推荐方法3,异步加载。所谓直接加载,就是把把图片完全加载到缓冲中后在显示,而异步加载则是在主要图片还在加载的时候,用一张图片来代替显示。通过异步加载的方式,还可以方便地获得当前的加载进度从而进行显示。

    下面是显示图片的代码:


try
            {
                pictureBox1.WaitOnLoad = false;
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
               pictureBox1.LoadAsync(urlString);
            }
            catch
            {
                MessageBox.Show(" 网络连接失败 ");
            }  

    为了实现本问刚开始图片中的进度读取功能,应该在窗体中添加一个label控件和一个progressar控件,并为picturebox添加LoadProgressChange事件,相关代码如下:

 private void pictureBox1_LoadProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            label4.Text = e.ProgressPercentage.ToString() + " % ";
        }

    最后希望本文对大家有一定的帮助,欢迎一起探讨技术问题。


参考文献


[1]   c# winform读取oracleblob字段的图片并且显示到pictureBox里,保存进库 - 黑色头发 - ITeye技术网站[EB/OL].[2017/5/9]. http://heisetoufa.iteye.com/blog/243172.


[2]   C# PictureBox加载图片并显示进度条 -编程 - IT610.com[EB/OL].[2017/5/9]. http://www.it610.com/article/1224039.htm.












猜你喜欢

转载自blog.csdn.net/skytruine/article/details/71530135