废话不多说,先上结果图。
最近做某旅游系统,需要一个窗口来显示旅游景点的信息。主要内容包括名称、图片和描述。系统的数据库是位于阿里云服务器上的oracle,系统是用c#开发的winform应用。在数据显示这一部分,很重要的一个问题就是图片应该用什么样的方法存储?从网上看了诸多博客,发现主要有以下四种方法:
①把图片直接以blob的类型存在Oracle数据库中,再调用;
②把图片放在本地,和应用程序一起打包,在oracle中存图片的相对路径;
③手动把图片放在数据库所在的服务器上,在oracle中存对应的URL;
④直接调用网络图片,只在oracle中存网络图片的URL;
事实上,③和④的原理是一致的,都是调用服务器(网络)资源。考虑到②会使得客户端软件较大,①是一种对数据库资源的浪费且我们需要的图片可能随时更换。因此,我们考虑采用第④种方法来实现。
STEP 1: 建立数据库(如何连接远程数据库我这里就不赘述了)
不论是用sqlserver还是命令行的方式,总之先把表给建立起来。
注意URL用变长字符串类型VARCHAR2来存,大小设置的稍微大一些。图片的URL是在网上找,可以通过度娘或google来搜,注意,要把搜出来的图片单独拖出来形成一个网页看它的URL,这个才是这图片真正的URL。
STEP 2: 编码
有几个值得注意的点
①数据库连接与sql执行
不论是什么sql server,mysql还是我们这里用的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显示图片一般有三种方式:
(1)picturebox1.image= Image xxx:把一个Image对象赋值给picturebox;
(2)picturebox1.Load(string url):通过url进行图片的直接加载;
(3)picturebox1.LoadAsync(string url):通过url进行图片的异步加载。
考虑到我们从数据库中获得的是图片的url,因此方法应该在2和3中选择。这里推荐方法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读取oracle中blob字段的图片并且显示到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.