实现功能如下图:

注明:此文使用的是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. C#泛型的抗变与协变

    C#泛型的抗变与协变 学习自 C#本质论6.0 https://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html Overview 一直以来 ...

  2. 错误跳转js

    <script type="text/javascript"> var t = 5; //倒计时的秒数 function showTime(){ document.ge ...

  3. 1257: [CQOI2007]余数之和

    题目链接 bzoj1257: [CQOI2007]余数之和 题解 数论分块,乘等差数列求和 代码 #include<bits/stdc++.h> using namespace std; ...

  4. CentOS添加环境变量的三种方式

    CentOS添加环境变量的三种方式,以添加php环境变量为例,假定php的安装目录为 /usr/local/php5 一.仅对当前会话临时生效 [root@bogon ~]# export PATH= ...

  5. Windows 2008 R2防火墙设置运行被ping通

    参考文献: http://huobumingbai.blog.51cto.com/1196746/323896/

  6. C#怎么通过一个按钮Button,实现点击这个按钮可以打开一个文件或者文件夹?

    string path1 = @"d:\log.txt";  //打开D盘下的log.txt文件 System.Diagnostics.Process.Start(path1); ...

  7. go标准库DOC与 raft

    http://studygolang.com/static/pkgdoc/index.html https://github.com/avelino/awesome-go#database

  8. poj1321 棋盘问题(深搜dfs)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/prob ...

  9. 多个按钮触发同一个Bootstrap自适应模态窗口

    在项目中可能会面对这样的一个场景: 界面上有多个按钮,我们希望点击这些按钮弹出同一个模态窗口,但希望模态窗口的内容是动态生成的,即,点击每个按钮弹出的模态窗口内容不同. 通常情况下,一个按钮对应一个模 ...

  10. android 模拟器报 no CPU/ABI system image for target

    搭建完成Android开发环境后,在创建安卓模拟器的时候遇到了问题.这个问题就是图片中显示的no CPU/ABI system image available for this target还有no ...