问题描述:将图片、二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段。

分析:由于之前数据库中没有用过varbinary存储数据,首先要把varbinary搞懂了,其次就是图片类型与二进制类型之间的转换,文件类型与二进制类型之间的转换。

准备工作:

    1.varbinary 与 binary的区别:     

       固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型。

       binary [ ( n ) ]

固定长度的 n 个字节二进制数据。N 必须从 1 到 8,000。存储空间大小为 n+4 字节。

varbinary [ ( n ) ]

n 个字节变长二进制数据。n 必须从 1 到 8,000。存储空间大小为实际输入数据长度 +4 个字节,而不是 n 个字节。输入的数据长度可能为 0 字节。在 SQL-92 中 varbinary 的同义词为 binary varying。

注释:如果在数据定义或变量声明语句中没有指定 n,默认长度为 1。如果没有用 CAST 函数指定 n,默认长度为 30。

    2.由于使用了MVC结构,生成Model类的时候竟然不知道其对应类型,网上搜也没有结果,首先用了一个System.Data.SqlTypes.SqlBytes,后来误打误撞才发现竟然就是byte[]类型。

实现示例:

//1.首先将图片装换成字节数组
Bitmap btm = new Bitmap("C:/Users/Desktop/1.jpg");
MemoryStream ms = new MemoryStream();
btm.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.GetBuffer();
//byte[] bytes= ms.ToArray(); 这两句都可以
ms.Close(); try{
//2.往数据库里写图片数据
//先打开两个类库文件
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=.;database=Test;uid=sa;pwd=123456";
con.Open();
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandType = CommandType.Text;
com.CommandText = "insert into Map(Id,BitmapData) values(1,@photo)";
com.Parameters.AddWithValue("@photo", bytes);
SqlDataReader dr = com.ExecuteReader();//执行SQL语句
dr.Close();//关闭执行
con.Close();//关闭数据库 //3.从数据库中取图片数据并显示
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=.;database=Test;uid=sa;pwd=123456";
String sql = "select * from Map where Id=1";
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.Read()){
if (!dr.IsDBNull())//防止照片字段为空
{
System.Data.SqlTypes.SqlBytes dataBytes = dr.GetSqlBytes();
Image imge= Image.FromStream(dataBytes.Stream);//显示照片
pb.ImageLocation = null;
pb.Image = null;
pb.Image = imge;
}
}
}
con.Close();//关闭数据库 }
catch (Exception)
{ throw;
}

上述为测试示例,没有直接取byte[]类型,如果要转化成byte[]类型,可以用如下方法:

byte[] b=dr.GetSqlBytes(1).Value;
    byte[] b1 = dr.GetSqlBytes(1).Buffer;

数据库中用varbinary存储二进制数据的更多相关文章

  1. mssql sqlserver 可以存储二进制数据的字段类型详解

    转自: http://www.maomao365.com/?p=6738 摘要: 下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据的数据类型,如下所示: mssql s ...

  2. mysql 存储二进制数据

    晚上小研究了下MySQL存储于读取二进制数据的功能.关键步骤为以下三点: 最重要的一点:存储二进制数据的表的类型需要是blob类型(按长度不同分为tiny, media, long) 插入二进制数据时 ...

  3. mongodb存储二进制数据

    mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...

  4. python django中使用sqlite3数据库 存储二进制数据ByteArray

    在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...

  5. 讨论贴:Sqlserver varbinary 是二进制数据,却是十六进制的表现形式

    首先创建一个数据表 CREATE TABLE [dbo].[log_info]( [id] [,) NOT NULL, [info] [varchar]() NULL, [info1] [varbin ...

  6. mongodb存储二进制数据的二种方式——binary bson或gridfs

    python 版本为2.7 mongodb版本2.6.5 使用mongodb存储文件,可以使用两种方式,一种是像存储普通数据那样,将文件转化为二进制数据存入mongodb,另一种使用gridfs,咱们 ...

  7. BLOB:大数据,大对象,在数据库中用来存储超长文本的数据,例如图片等

    将一张图片存储在mysql中,并读取出来(BLOB数据:插入BLOB类型的数据必须使用PreparedStatement,因为插入BLOB类型的数据无法使用字符串拼写): -------------- ...

  8. pg 和sql server 分别如何新建二进制数据库字段以及插入二进制数据的sql语句

    PG create table demo ( id int, name bytea ); Insert into demo (id,name)values(256,pg_read_binary_fil ...

  9. BLOB类型的字段用于存储二进制数据

    MySQL中,BLOB是个类型系列,包括:TinyBlob.Blob.MediumBlob.LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同. MySQL的四种BLOB类型类型 ...

随机推荐

  1. ORACLE 生成一个随机数

    ORACLE 如何产生一个随机数:DBMS_RANDOM--1.小数( 0 ~ 1) select dbms_random.value from dual ; --2.指定范围内的小数 ( 0 ~ 1 ...

  2. Samba 共享文件后在Windows 上无法访问的问题

    /etc/samba/smb.conf的配置如下: #============================ Share Definitions ========================== ...

  3. @ViewDebug.ExportedProperty的使用

    原文链接:http://daemon369.github.io/android/2014/06/12/android-viewdebug-exportedproperty/ http://www.eo ...

  4. exception 'yii\base\ErrorException' with message 'Class 'MongoClient' not found'

    问题描述: 本来项目运行的好好的,搬了一次办公室(电脑主机一起搬的),第二天的时候就登录不了了. php版本和扩展没有改变,且没有修改任何配置,我尝试重启php5-fpm 服务,又重启nginx服务, ...

  5. linux命令(7):mv命令

    mv命令 mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] ...

  6. db2 with ur

    这几天查询DB2数据库,老遇到select * from XXX with ur, 好奇ur是什么作用,现在记录一下. DB2中,共有四种隔离级:RS,RR,CS,UR,DB2提供了这4种不同的保护级 ...

  7. 第三节 Hello world --python初体验

    祭旗--hello world 据说简单优雅.功能强大是python的魅力所在,这里看到简单了,优雅是什么样的,接下来的学习中慢慢体会吧! print ("Hello world" ...

  8. UIAlertViewController的使用

    UIAlertViewController是苹果自带的信息提示框,仅在iOS8.0以后可以使用 NS_CLASS_AVAILABLE_IOS(8_0) @interface UIAlertContro ...

  9. Session过期、失效时间

    Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下! 1.session其实就是一个Map,键=值对,通过session.getAttribute("name& ...

  10. 记录第一次搭建svn服务器

    搭建svn服务器需要另外的软件, 在此以32位的为例: 安装过程非常简单, 一直下一步下一步确定就好了, svn安装完毕再安装中文语言包, 安装完成后可以在设置里面找到中文简体选择就OK了 主要记录一 ...