ADO.NET笔记——读取二进制大对象(BLOB)
相关知识:
- 在SQL Server中,一般情况下,每行数据的总长度不能超过8K字节。因此,下列数据类型的长度,也不能超过8K字节:binary,char(),nchar(),varchar(),nvarchar()。注意,由于nvarchar是Unicode字符,因此,其最大长度也不能超过nvarchar(4000)
- 对于超长数据,尤其是二进制数据(例如音频视频数据等),SQL Server提供了下列数据类型(可以超过8K):image,varbinary(max),text,ntext,varchar(max),nvarchar(max)
- 对于较小的二进制数据,可以公国DataReader或者DataSet一次性读取。但是对于较大的二进制数据(BLOB),例如1MB以上,如果一次性把所有数据都读取出来,就会消耗大量的程序内存(字节数组)。因此,往往是采用分批读取的方式进行
- SqlDataReader的二进制读取:
- 在ExecuteReader调用时,要指定CommandBehavior.SequentialAccess选项,以表明通过顺序的方式逐段读取
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
- GetBytes函数,可以将二进制字段中的数据逐段读到缓冲区中
- 应当优先把BLOB字段前的其他字段读取出来,否则一旦开始读BLOB字段,将无法再回头去读之前的字段
- 在ExecuteReader调用时,要指定CommandBehavior.SequentialAccess选项,以表明通过顺序的方式逐段读取
代码示例:
- 数据库:采用红皮书的示例数据库,AdventureWorks_WroxSSRS2012,使用Production.ProductPhoto表,获取其中的图片数据信息


- 引入:
using System.Data;
using System.Data.SqlClient;
using System.IO;
- 基本定义:
const int BUF_SIZE = ;//缓冲区大小
static string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root";
static SqlConnection conn = new SqlConnection(strConn);
//优先把BLOB字段前的其他字段读取出来,否则一旦开始读BLOB字段,将无法再回头去读之前的字段(注意此sql语句中字段的顺序与数据库字段顺序的对比)
static string strCmd = "SELECT ProductPhotoID,ThumbnailPhotoFileName,ThumbNailPhoto,LargePhotoFileName,LargePhoto FROM Production.ProductPhoto";
static SqlCommand cmd = new SqlCommand(strCmd, conn); - 访问ProductPhoto表
static void Main(string[] args)
{
try
{
conn.Open();
//以SequentialAccesss方式打开DataReader
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (dr.Read())
{
int productPhotoID = dr.GetInt32();
string thumbnailPhotoFileName = dr.GetString();//读取缩略图文件名
WriteThumbnailPhotoFile(thumbnailPhotoFileName, dr);//将缩略图二进制数据写入磁盘文件
string largePhotoFileName = dr.GetString();//读取大图文件名
WriteLargePhotoFile(largePhotoFileName, dr);//将大图二进制数据写入磁盘文件
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
finally
{
conn.Close();
}
} - 将缩略图二进制数据写入磁盘文件的函数
static void WriteThumbnailPhotoFile(string fileName, SqlDataReader dr)
{
string path = "..\\..\\images\\Thumbnail\\" + fileName;//需要预先在项目文件夹中建立此目录
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
//ThumbnailPhoto的数据比较小(没有超过8KB),因此选择一次性读出,直接写入文件
byte[] buf = dr[] as byte[];
fs.Write(buf, , buf.Length);
fs.Close();
} - 将大图二进制数据写入磁盘文件的函数
static void WriteLargePhotoFile(string fileName, SqlDataReader dr)
{
string path = "..\\..\\images\\Large\\" + fileName;//需要预先在项目文件夹中建立此目录
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
byte[] buf = new byte[BUF_SIZE];
long bytesRead = ;
long startIndex = ;
//LargePhoto的数据比较大,因此分批次读出,分别写入文件
while ((bytesRead = dr.GetBytes(, startIndex, buf, , BUF_SIZE)) > )
{
fs.Write(buf, , (int)bytesRead);
startIndex += bytesRead;
}
fs.Close();
}
程序说明:
需要预先在本项目文件夹下建立images目录,内有thumbnail和large子目录,用于存放从数据库获取的图片

ADO.NET笔记——读取二进制大对象(BLOB)的更多相关文章
- ADO.NET笔记——存储二进制大对象(BLOB)
相关知识 上传二进制大对象(Binary Large Object)(如图片.视频等)的基本编程步骤是: 在数据库中使用varbinary(MAX).varchar(MAX)或者nvarchar(MA ...
- ADO学习笔记之注入漏洞与参数化查询
ADO学习笔记之注入漏洞与参数化查询 作为新手,在学习ADO程序时,使用 sql 语言查询数据时,很容易写类似如下代码: using (SqlConnection con = new SqlConne ...
- ADO.NET笔记20160322
####ADO.NET ####1 启用sa验证与窗体相关知识 - 启用sa验证 - ShowDialog() ---- ####2 连接字符串 Data Source=服务器 ...
- ADO.net笔记
1.DbConnectionConnection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接.所有Connection对象的基类都是DbConnection类.Conn ...
- 10.4(java学习笔记)CLOB,BLOB基本操作
一.CLOB 1.1CLOB简介 CLOB全称是(Character Large Object)字符大对象,用于存储大量的文本数据. 字符大对象的操作不同于一般数据,是通过流来完成的. 1.2MySQ ...
- ADO.NET(OleDb)读取Excel表格时的一个BUG
如果我们有例如以下一个Excel表格: 如今要使用C#程序读取其内容: using System; using System.Data.OleDb; namespace Skyiv.Be ...
- python3笔记-读取ini配置文件
在代码中经常会通过ini文件来配置一些常修改的配置.下面通过一个实例来看下如何写入.读取ini配置文件. 需要的配置文件是: [path] back_dir = /Users/abc/PycharmP ...
- Ado.net 数据库读取文件
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; using ...
- FPGA笔记-读取.dat文件
读取.dat图像文件 .dat文件是matlab生成的图像文件 initial begin // Initialize Inputs CLK = 0; RST = 1; IMAGE_DATA = 0; ...
随机推荐
- Ubuntu下安装FTP服务及使用(以VSFTPD为例)
(一)安装与配置 (1) 安装vsftpd $sudo apt-get install vsftpd 这里会提示无法创建/home/ftp目录,手动创建一个 $sudo mkdir /ho ...
- oracle视图总结
视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表.视图是存储在数据字典里的一条select语句. 通过创建视图可以提取数 ...
- UITableView 折叠效果
1:创建一个model数据模型 #import <Foundation/Foundation.h> @interface DataModel : NSObject //保存section中 ...
- 在C#中使用NPOI2.0操作Excel2003和Excel2007
Excel2003: #region Excel2003 /// <summary> /// 将Excel文件中的数据读出到DataTable中(xls) /// </summary ...
- 【Linux/Ubuntu学习4】ubuntu 下面安装 vim 的问题
ubuntu 下面安装 vim 的问题 1.输入vim时,显示: 程序“vim”已包含在以下软件包中: * vim * vim-gnome * vim-tiny * vim-gtk * vim-nox ...
- (转)Android学习笔记③——常用快捷键
常用快捷键 代码跳转 描述:跳转是为了方便代码位置的定位,存在两种跳转:在定义处可以跳转到调用处,在调用处可以跳转到定义处. 快捷键:Cmd + 鼠标单击 方法间跳转 描述:从一个类方法跳转到临近的一 ...
- UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position xxx ordinal
python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: 'ascii' codec can't deco ...
- WPF省市联动Binding
主要思路: 把省的ItemsSource绑定DataContext,然后给市的ItemsSource绑定到Element(省)的SelectedItem上 xaml <Window x:Clas ...
- 友盟分享各平台URL设置
首先,想要进项友盟分享,需要到各平台去申请ID和KEY 比如想进行微信分享,就到微信开发者平台去创建应用,拿到对应的id和appScreat,然后进行设置: 参考资料
- 跨域iframe高度自适应(兼容IE/FF/OP/Chrome)
采用JavaScript来控制iframe元素的高度是iframe高度自适应的关键,同时由于JavaScript对不同域名下权限的控制,引发出同域.跨域两种情况. 由于客户端js使用浏览器的同源安全策 ...