实现功能如下图:

注明:此文使用的是DevExpress控件,winform 原生控件也是一样使用方法。

1.点击选择图片按钮,功能为通过对话框选择要上传的文件,并将该文件在下面的PictureEdit中显示出来。具体代码如下:

private void btnChoosePic_Click(object sender, EventArgs e)
{
ShowPic(pictureEdit1);
} /// <summary>
/// 选择图片
/// </summary>
/// <param name="picEdit"></param>
public static void ShowPic(PictureEdit picEdit)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"C:\";
ofd.Filter = "Image Files(*.JPG;*.PNG;*.jpeg;*.GIF;*.BMP)|*.JPG;*.PNG;*.GIF;*.BMP;*.jpeg|All files(*.*)|*.*";
ofd.RestoreDirectory = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
PicAddress = ofd.FileName;
Image imge = Image.FromFile(PicAddress);
Bitmap bm = new Bitmap(imge, picEdit.Width, picEdit.Height);
picEdit.Image = bm;
}
}

ShowPic()方法为静态方法,可以直接调用,其中的PicAddress变量为静态全局变量,用于记录要上传文件的文件地址。PictureEdit显示图片的方式,是通过PictureEdit的image属性设定的,将图片转成Bitmap格式,位图文件是最简单的图片格式。

2.上传图片,该按钮的功能是将选定的图片上传到数据库中,具体的实现代码如下:

/// <summary>
/// 上传图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUploadPic_Click(object sender, EventArgs e)
{
if (PicAddress != null)
{
if (PicType.Equals("教师"))
{
var sqlSearch =
$@"select count(*) from studentmanager.picture where PicTypeId = '{TeacherId}'
and PicType='{PicType}'";
var dsSearch = _db.GetResult(sqlSearch);
if (dsSearch.Tables[0].Rows[0][0].ToString().Equals("0")) //没有重复的,则进行新增插入操作
{
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.SavePictureToDB(pic, PicAddress, PicType, TeacherId);
if (result > 0)
{
CommonFunction.MessageShow("头像添加成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("头像添加失败");
}
}
else
{
//更新头像
if (PicAddress.Equals(String.Empty))
{
CommonFunction.MessageShow("没有重新选择图片进行更新");
return;
}
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.UpdatePictureToDb(pic, PicAddress, PicType, TeacherId);
if (result > 0)
{
CommonFunction.MessageShow("头像更新成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("头像更新失败");
}
}
}
else if(PicType.Equals("学生"))
{
var sqlSearch =
$@"select count(*) from studentmanager.picture where PicTypeId = '{StudentId}'
and PicType='{PicType}'";
var dsSearch = _db.GetResult(sqlSearch);
if (dsSearch.Tables[0].Rows[0][0].ToString().Equals("0")) //没有重复的,则进行新增插入操作
{
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.SavePictureToDB(pic, PicAddress, PicType, StudentId);
if (result > 0)
{
CommonFunction.MessageShow("头像添加成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("头像添加失败");
}
}
else
{
//更新头像
if (PicAddress.Equals(String.Empty))
{
CommonFunction.MessageShow("没有重新选择图片进行更新");
return;
}
byte[] pic = CommonFunction.GetContent(PicAddress);
var result = _db.UpdatePictureToDb(pic, PicAddress, PicType, StudentId);
if (result > 0)
{
CommonFunction.MessageShow("头像更新成功", "提示", "OK", "Information");
DialogResult = DialogResult.OK;
}
else
{
CommonFunction.MessageShow("头像更新失败");
}
}
}
}
else
{
CommonFunction.MessageShow("请先选择图片!", "提示", "OK", "Error");
}
}

上传的过程大概就是:根据文件地址将对应文件转换成数据流二进制格式–>编写对应的SQL语句–>执行该SQL语句,将图片添加到数据库中。
上面代码中SavePictureToDB方法代码如下:

/// <summary>
/// 保存图片到数据库
/// </summary>
/// <param name="imageByte"></param>
/// <param name="Tablename"></param>
/// <param name="FieldPicturename"></param>
/// <param name="FieldIdxname"></param>
/// <param name="FieldIdxvalue"></param>
/// <returns></returns>
public int SavePictureToDB(byte[] imageByte,
string Picturename,
string PicType,
int PicTypeId)
{
var result = 0;
try
{
if (imageByte != null && imageByte.Length != 0)
{
using (var conn = new MySqlConnection())
{
conn.ConnectionString = ConnectionString;
conn.Open(); var insertStr = @"INSERT INTO studentmanager.picture
(
Picturename,
PicType,
PicTypeId,
imageByte
)
VALUES
(
@Picturename,
@PicType,
@PicTypeId,
@imageByte
);";
var comm = new MySqlCommand();
comm.Connection = conn;
comm.CommandText = insertStr;
comm.CommandType = CommandType.Text; //设置数据库字段类型MediumBlob的值为图片字节数组imageByte
comm.Parameters.Add(new MySqlParameter("@imageByte", MySqlDbType.MediumBlob)).Value = imageByte;
comm.Parameters.Add(new MySqlParameter("@Picturename", MySqlDbType.VarChar)).Value = Picturename;
comm.Parameters.Add(new MySqlParameter("@PicType", MySqlDbType.VarChar)).Value = PicType;
comm.Parameters.Add(new MySqlParameter("@PicTypeId", MySqlDbType.Int32)).Value = PicTypeId;
//execute sql
result = comm.ExecuteNonQuery(); comm.Dispose();
conn.Close();
conn.Dispose();
}
}
}
catch (Exception)
{
// throw ex;
}
return result;
}

3.加载图片显示到PictureEdit;

/// <summary>
/// 窗口加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void HeadManager_Load(object sender, EventArgs e)
{
LoadImage(PicType, PicType.Equals("教师") ? TeacherId : StudentId);
} /// <summary>
/// 获取图片
/// </summary>
/// <param name="picType"></param>
/// <param name="picTypeid"></param>
private void LoadImage(string picType, int picTypeid)
{
try
{
var imageBytes = _db.GetImage(picType, picTypeid);
var image = CommonFunction.GetImageByBytes(imageBytes);
Bitmap bm = new Bitmap(image, pictureEdit1.Width, pictureEdit1.Height);
pictureEdit1.Image = bm;
}
catch (Exception)
{
pictureEdit1.Image = Resource.DefaultUser;
}
}

4.用到的公共方法:

/// <summary>
/// 转换为Byte[]
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public static byte[] GetContent(string filepath)//将指定路径下的文件转换成二进制代码,用于传输到数据库
{
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
byte[] byData = new byte[fs.Length];//新建用于保存文件流的字节数组
fs.Read(byData, 0, byData.Length);//读取文件流
fs.Close();
return byData;
} /// <summary>
/// 读取byte[]并转化为图片
/// </summary>
/// <param name="bytes">byte[]</param>
/// <returns>Image</returns>
public static Image GetImageByBytes(byte[] bytes)
{
Image photo;
using (MemoryStream ms = new MemoryStream(bytes))
{
ms.Write(bytes, 0, bytes.Length);
photo = Image.FromStream(ms, true);
ms.Dispose();
ms.Close();
}
return photo;
}

C# winform DevExpress上传图片到数据库【转】的更多相关文章

  1. Asp.Net MVC 上传图片到数据库

    [读书笔记]Asp.Net MVC 上传图片到数据库(会的绕行)   之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存 ...

  2. ASP.NET MVC 4 - 上传图片到数据库

    这里演示如何在MVC WEB应用程序如何上传图片到数据库以及如何在WEB页面上显示图片.数据库表对应整个Model类,不单图片数据一个字段,我们从数据表的定义开始: CREATE TABLE [dbo ...

  3. Winform访问本地SQLServer数据库文件

    Winform访问本地SQLServer数据库文件 1.项目中添加config配置,如下: <configuration> <connectionStrings> <ad ...

  4. WinForm里面连接Oracle数据库

    WinForm里面连接Oracle数据库 string oradb = "Data Source=(DESCRIPTION="             + "(ADDRE ...

  5. WinForm c# 备份 还原 数据库(Yc那些事儿 转)

    Yc那些事儿 我愿意 为了我的幸福 奋斗终生     2008-11-17 18:04 WinForm c# 备份 还原 数据库 其实是个非常简单的问题,一个Form,一个Button,一个OpenF ...

  6. C#基础——winform应用上传图片到SQLServer数据库

    前言 之前通过winform与SQL Server的交互一直局限于文本.数字等信息,都可以通过string的方式来传输,但是比如音乐.图片等特殊格式的文件要如何与SQL Server数据库进行交互呢? ...

  7. DevExpress 中根据数据库字典动态生成卡式菜单 z

    第三方的Devexpress套件因为要使用权限机制控制不同用户进入系统显示菜单所以要配合字典数据动态生成.在WEB中这种问题灰常的轻松在winform里就稍微有点不同为了用DEV实现卡式菜单有组的概念 ...

  8. WinForm DevExpress使用之ChartControl控件绘制图表一——基础

    最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...

  9. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

随机推荐

  1. 玩转SpringCloud(F版本) 二.服务消费者(2)feign

    上一篇博客讲解了服务消费者的ribbon+restTemplate模式的搭建,此篇文章将要讲解服务消费者feign模式的搭建,这里是为了普及知识 平时的项目中两种消费模式选择其一即可 本篇博客基于博客 ...

  2. C#简单的通用分页

    通用分页技术分析 需要返回不同的类型的数据--采用泛型实现该操作 需要提供不同的方法 上一页 上一页 第一页 最后一页 跳转到指定页 Demo 代码 using System; using Syste ...

  3. OSX下面用ffmpeg抓取桌面以及摄像头推流进行直播

    参考博客 http://blog.chinaunix.net/uid-11344913-id-4665455.html 在osx系统下通过ffmpeg查看设备 ffmpeg -f avfoundati ...

  4. shell脚本调用C语言之字符串切分函数——strtok

    今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...

  5. mmc生产任务分配问题续

    mmc生产任务分配问题续,本题目比上个题目难, 要注意的是,生产,销售,库存的关系, 生产+上月库存-销售=本月库存, 期初,生产=库存,销售没有.

  6. SpringMVC介绍之视图解析器ViewResolver

    在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视图解析器.当我们对SpringMVC控制的资源发起请求时,这些请求都会被SpringMV ...

  7. [EF]数据上下文该如何实例化?

    摘要 之前使用过一段Nhibernate,最近在尝试EF做项目,但对DbContext的实例化,有点困惑,发现和Nhibernate有不同.这里将查找的例子,在这里列举一下. 资料 在EntityFr ...

  8. Chrome 如何知道网站启用了SPDY 协议?

    地址栏输入chrome://net-internals/#spdy 在host后查看协议,google和dropbox用https协议的开启了 3. 也可以通过安装插件来查看(SPDY Indicat ...

  9. C++ inline内联函数

    inline 函数避免函数调用的开销 // find longer of two strings const string &shorterString(const string &s ...

  10. Traceroute(路由追踪)的原理及实现

    现实世界中的网络是由无数的计算机和路由器组成的一张的大网,应用的数据包在发送到服务器之前都要经过层层的路由转发.而Traceroute是一种常规的网络分析工具,用来定位到目标主机之间的所有路由器 原理 ...