前言

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

今天主要讲通过文件流的方式,将特殊文件转换成二进制,然后存储到数据库中。在实际的应用中,如果文件较大或者较多,直接存储在数据中会造成一定的压力,可以转为保存文件名,然后在实际使用的地方调用改文件名对应的文件。

主要内容

上图为图片上传winform的内容。

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

 private void btn_Choose_Click(object sender, EventArgs e)
{
UserMethod.ShowPic(this.pictureBox1);
}
  public static void ShowPic(PictureBox picBox)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"E:\";
ofd.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files(*.*)|*.*";
ofd.RestoreDirectory = true; if (ofd.ShowDialog() == DialogResult.OK)
{
picAddress = ofd.FileName;
Image imge = Image.FromFile(picAddress);
Bitmap bm = new Bitmap(imge, picBox.Width, picBox.Height);
picBox.Image = bm;
}
}

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

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

  private void btn_Upload_Click(object sender, EventArgs e)
{
if (UserMethod.picAddress == null)
{
Byte[] pic = UserMethod.GetContent(UserMethod.picAddress);
string sql = "insert into tb_MyPic values(@Picture,@PicCategory)";
SqlParameter[] param = new SqlParameter[];
param[] = new SqlParameter("@Picture", pic);
param[] = new SqlParameter("@PicCategory", this.cmbCatogery.Text.Trim());
if (DataBase.getExecuteQuery(sql, param) != )
{
MessageBox.Show("添加成功!");
}
}
else
{
MessageBox.Show("请先选择图片!");
}
}
      public static string picAddress = string.Empty;
public static Byte[] GetContent(string filepath)//将指定路径下的文件转换成二进制代码,用于传输到数据库
{
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
Byte[] byData = new Byte[fs.Length];//新建用于保存文件流的字节数组
fs.Read(byData, , byData.Length);//读取文件流
fs.Close();
return byData;
}

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

3、使用sql Parameter[]的SQL执行方法,因为传统的sql语句对应的value终归是string或者int之类的格式,可以在sql语句中写一下,但是使用Parameter的方式可以更加简洁、明了、减少失误。具体的执行sql语句方法参考如下代码:

  public static int getExecuteQuery(string sql, SqlParameter[] param)
{
getcon();
SqlCommand sqlcom = new SqlCommand(sql, My_Conn);
sqlcom.Parameters.AddRange(param);
return sqlcom.ExecuteNonQuery();
}

OK,下次会跟大家讲一下如何从sql数据中下载图片显示到winform中来。

C#基础——winform应用上传图片到SQLServer数据库的更多相关文章

  1. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  2. 基于Winform框架DataGridView控件的SqlServer数据库查询展示功能的实现

    关键词:Winform.DataGridView.SqlServer 一个基于winform框架的C/S软件,主要实现对SqlServer数据库数据表的实时查询. 一.为DataGridView添加数 ...

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

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

  4. 使用vbScript 链接SQLserver数据库和基础操作

    使用vbs链接SQLserver数据库 数据库的创建.设计使用 management studio完成 1.本地链接数据库 set oCon = server.createObject("a ...

  5. Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

    在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适 ...

  6. Sqlserver数据库总结

    由于公司项目需要这段时间一直在做有关于数据库方面的工作.趁这段时间有空,对数据库方面的知识进行一个梳理和归纳,以便以后需要时,查看起来方便. 使用的数据库主要有ORACLE10g和Sqlserver2 ...

  7. 基于4.5Framework web程序、SQLSERVER数据库打包

    原文:基于4.5Framework web程序.SQLSERVER数据库打包 估计很多朋友和我一样,对于C/S程序打包很熟悉,但对于B/S程序打包一头雾水... 最近公司要求我们把项目和数据库(SQL ...

  8. SQLServer数据库中开启CDC导致事务日志空间被占满的原因

    SQLServer数据库中开启CDC导致事务日志空间被占满的原因 转载  2017-04-01   投稿:mrr    我要评论 这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间 ...

  9. Sqlserver数据库发送邮件

    目录 1. Sqlserver数据库发送邮件 1.1. 概念了解 1.2. 配置 1.3. 测试发送邮件 1.3.1. 代码测试 1.3.2. 工具测试 1.4. 查看邮件日志 1. Sqlserve ...

随机推荐

  1. Python future模块

    今天看到了Pyhon中的模块__future__,查了一下资料,感觉这个module很有用. 从python2.1开始以后, 当一个新的语言特性首次出现在发行版中时候, 如果该新特性与以前旧版本pyt ...

  2. Fibonacci(斐波那契)非递归实现。容易看懂

    #include<iostream>using namespace std;int main(){ int n; cout<<"please input a n\n& ...

  3. 杭电--1162--Eddy's picture--并查集

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. Eclipse中怎么安装TestNG单元测试框架

    在进行使用的eclipse的进行开发的代码中,必然就会需要进行单元测试,在单元测试的情况提供较多的框架单元测试,例如使用junit单元测试,而在国外进行开发较好的单元测试,提供了较好的测试的报告,ju ...

  5. 一、Python 简介

    There should be one -- and preferably only one -- obvious way to do it. 一种解释型,面向对象的.带有动态语义的高级程序设计语言. ...

  6. centos7 jexus在vmware下能访问,主机访问不了解决方案

    能PING通,访问不了web,先在CMD测试telnet ip 80看看是否是防火墙的问题. 修改防火墙,打开指定端口 1 安装iptables [root@centos ~]# yum instal ...

  7. list内容按长度等分

    这里需要导入 from more_itertools import chunked chunked(iterable, n) 将一个可迭代对象等分成n个list,第n个list的长度可能小于之前的. ...

  8. ubuntu 16.04 搭建无线共享热点(PC 无线直连Android移动终端 调试,监控屏幕)

    由于android终端usb接口比较松,公司的无线网络使用人过多比较慢,所以想使用PC端无线直连 调试Android终端 配置无线共享 1 网卡要支持 2 安装 plasma-nm sudo apt- ...

  9. sac 文档使用

    目前我遇到的问题是我想要得到BHE,BHN 方向的数据,但发现IRIS下载的数据都是BH1,BH2 方向的,很困惑,请教大神后发现,原来IRIS之所以提供BH1,BH2方向是因为很多时候台站的水平方向 ...

  10. Python开发入门与实战17-新浪云部署

    17. 新浪云部署 上一章节我们介绍了如何在本地windows服务器部署python django的网站,本章我们简要说明一下如何把python django工程部署到云服务上. 本章章节我们描述如何 ...