实现功能如下图:

注明:此文使用的是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. 命名和目录接口 JNDI-The Java Naming and Directory Interface

    命名和目录接口 JNDI-The Java Naming and Directory Interface JNDI (The Java Naming and Directory Interface)为 ...

  2. Java+Windows+ffmpeg实现视频转换

    最近由于项目需要,研究了一下如何用Java实现视频转换,“着实”废了点心思,整理整理,写出给自己备忘下. 思路 由于之前没有没法过相关功能的经验,一开始来真不知道从哪里入手.当然,这个解决,googl ...

  3. 性能优化:使用SparseArray代替HashMap<Integer,Object>(转)

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  4. Amontec JTAGkey (FT2232)

    The JTAGkey is based on the FTDIChip FT2232L, is a USB 2.0 device and is used for: On-Chip Debugging ...

  5. [Go] md5 加密 示例

    package main import ( "crypto/md5" "encoding/hex" "fmt" "io" ...

  6. HDU4607(求树中的最长链)

    题目:Park Visit 题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1) 解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K&l ...

  7. 自己动手写Vue插件Toast

    <style> .vue-toast { width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; backgrou ...

  8. Snmp学习总结(四)——WinServer2003安装和配置SNMP

    一.安装SNMP 今天讲解一下在WinServer2003安装和配置SNMP,具体操作步骤如下: 找到[控制面板]→[添加或删除程序]

  9. PrefixSpan

    http://www.codesoso.net/Search?q=prefixspan

  10. Android开发中,比较有特色的特性(与iOS相比)

    1.界面代码和界面控件元素时时联动.同步 2.当我们创建一个Activity时,系统自动帮我们维护strings.xml 文件和AndroidManifest.xml文件. 3.有来无回,删除.修改时 ...