ADO.NET笔记——读取二进制大对象(BLOB)

王朝学院·作者佚名  2016-05-25
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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字段,将无法再回头去读之前的字段

代码示例:

数据库:采用红皮书的示例数据库,AdventureWorks_WroxSSRS2012,使用PRoduction.ProductPhoto表,获取其中的图片数据信息

引入:using System.Data;using System.Data.SqlClient;using System.IO;

基本定义:1 const int BUF_SIZE = 1024;//缓冲区大小2 static string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root";3 static SqlConnection conn = new SqlConnection(strConn);4 //优先把BLOB字段前的其他字段读取出来,否则一旦开始读BLOB字段,将无法再回头去读之前的字段(注意此sql语句中字段的顺序与数据库字段顺序的对比)5 static string strCmd = "SELECT ProductPhotoID,ThumbnailPhotoFileName,ThumbNailPhoto,LargePhotoFileName,LargePhoto FROM Production.ProductPhoto";6 static SqlCommand cmd = new SqlCommand(strCmd, conn);

访问ProductPhoto表 1 static void Main(string[] args) 2 { 3 try 4 { 5 conn.Open(); 6 //以SequentialAccesss方式打开DataReader 7 SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess); 8 while (dr.Read()) 9 {10 int productPhotoID = dr.GetInt32(0);11 string thumbnailPhotoFileName = dr.GetString(1);//读取缩略图文件名12 WriteThumbnailPhotoFile(thumbnailPhotoFileName, dr);//将缩略图二进制数据写入磁盘文件13 string largePhotoFileName = dr.GetString(3);//读取大图文件名14 WriteLargePhotoFile(largePhotoFileName, dr);//将大图二进制数据写入磁盘文件15 }16 }17 catch (Exception e)18 {19 Console.WriteLine(e);20 }21 finally22 {23 conn.Close();24 }25 }

将缩略图二进制数据写入磁盘文件的函数1 static void WriteThumbnailPhotoFile(string fileName, SqlDataReader dr)2 {3 string path = "..\\..\\images\\Thumbnail\\" + fileName;//需要预先在项目文件夹中建立此目录4 FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);5 //ThumbnailPhoto的数据比较小(没有超过8KB),因此选择一次性读出,直接写入文件6 byte[] buf = dr[2] as byte[];7 fs.Write(buf, 0, buf.Length);8 fs.Close();9 }

将大图二进制数据写入磁盘文件的函数 1 static void WriteLargePhotoFile(string fileName, SqlDataReader dr) 2 { 3 string path = "..\\..\\images\\Large\\" + fileName;//需要预先在项目文件夹中建立此目录 4 FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write); 5 byte[] buf = new byte[BUF_SIZE]; 6 long bytesRead = 0; 7 long startIndex = 0; 8 //LargePhoto的数据比较大,因此分批次读出,分别写入文件 9 while ((bytesRead = dr.GetBytes(4, startIndex, buf, 0, BUF_SIZE)) > 0)10 {11 fs.Write(buf, 0, (int)bytesRead);12 startIndex += bytesRead;13 }14 fs.Close();15 }

程序说明:

需要预先在本项目文件夹下建立images目录,内有thumbnail和large子目录,用于存放从数据库获取的图片

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航