c mysql varbinary_数据库中用varbinary存储二进制数据

c mysql varbinary_数据库中用varbinary存储二进制数据问题描述 将图片 二进制文件内容等数据存储在数据库中 并能从数据库中取出还原为图片或文件 数据库存储二进制数据用 varbinary 字段 分析 由于之前数据库中没有用过 varbinary 存储数据 首先要把 varbinary 搞懂了 其次就是图片类型与二进制类型之间的转换 文件类型与二进制类型之间的转换 准备工作 1 varbinary 与 binary 的区别 固定长度 binary 的或可变长度

问题描述:将图片、二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用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= newMemoryStream();

btm.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);byte[] bytes =ms.GetBuffer();//byte[] bytes= ms.ToArray(); 这两句都可以

ms.Close();try{//2.往数据库里写图片数据//先打开两个类库文件

SqlConnection con = newSqlConnection();

con.ConnectionString= “server=.;database=Test;uid=sa;pwd=”;

con.Open();

SqlCommand com= newSqlCommand();

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 = newSqlConnection();

con.ConnectionString= “server=.;database=Test;uid=sa;pwd=”;

String sql= “select * from Map where Id=1”;

SqlCommand cmd= newSqlCommand(sql, con);

con.Open();using (SqlDataReader dr =cmd.ExecuteReader())

{if(dr.Read()){if (!dr.IsDBNull(1))//防止照片字段为空

{

System.Data.SqlTypes.SqlBytes dataBytes= dr.GetSqlBytes(1);

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;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215275.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:16
下一篇 2026年3月18日 下午2:17


相关推荐

  • Vivado保存ila波形

    Vivado保存ila波形保存 write hw ila data 路径 upload hw ila datahw ila write hw ila dataF work 17 vpss debug vid vpss vpm top srcs sources 1 ila fpga wr wave upload hw ila datahw ila 4 读取 read hw ila data

    2026年3月20日
    2
  • 全局钩子注入

    全局钩子注入全局钩子介绍hook,指利用api来提前拦截并处理windows消息的一种技术。如键盘钩子,许多木马都有这东西,监视你的键盘操作。全局钩子是系统钩子的一种,当指定的一些消息被系统中任

    2021年12月13日
    46
  • Radius认证服务器的配置与应用(802.1x)

    Radius认证服务器的配置与应用(802.1x)Radius 认证服务器的配置与应用 802 1x 2011 年 7 月 8 日 09 4728 478 浏览数发表评论阅读评论文章作者 姜南 Slyar 文章来源 SlyarHome www slyar com 转载请注明 谢谢合作 Radius 认证服务器的配置与应用 802 1x 作者 北京师范大学珠海分校 信息技术学院 姜南环境 Windows2003R

    2026年3月16日
    1
  • 程序员基本法则_程序员知识

    程序员基本法则_程序员知识DRY(不要重复你自己) 可读性第一,性能第二 低耦合、高内聚 童子军军规(让营地比你来的时候更干净)

    2026年4月16日
    8
  • 显示为弹出窗口是什么意思(电脑总是弹出广告)

    今天很伤心啊,刚到学校的教室打开电脑准备链接校园网,谁知给我弹出个快快赶紧的把我的指甲刀那来,谁都不要拦我~~~~~~~~~~~~~~~~~~~~~~~~不说废话啦,讲操作了~~~~~~~~~~~~~~~~~~~啦啦~~~~~~~~~~~lala~~~~~首先在菜单栏里搜“默认应用设置”会出现这个点进去找到http然后点击,进去就会有个强烈推荐,点击进去就好。希…

    2022年4月18日
    57
  • 指示函数和sign函数(符号函数)

    指示函数和sign函数(符号函数)1 指示函数 1A x 1 x nbsp nbsp A0 x nbsp nbsp A1 A x begin cases 1 amp text x in A 0 amp text x notin A end cases 1A x 1 0 x nbsp nbsp Ax nbsp nbsp A 1A X 0 1 1 A X rightarrow 0 1 1A X 0 1 2 Sigmoid 函数 y 11 e x

    2026年3月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号