麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > .NET > 正文

ADO.NET筆記——讀取二進(jìn)制大對(duì)象(BLOB)

2024-07-21 02:47:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
ADO.NET筆記——讀取二進(jìn)制大對(duì)象(BLOB)

相關(guān)知識(shí):

  1. 在SQL Server中,一般情況下,每行數(shù)據(jù)的總長(zhǎng)度不能超過(guò)8K字節(jié)。因此,下列數(shù)據(jù)類型的長(zhǎng)度,也不能超過(guò)8K字節(jié):binary,char(),nchar(),varchar(),nvarchar()。注意,由于nvarchar是Unicode字符,因此,其最大長(zhǎng)度也不能超過(guò)nvarchar(4000)
  2. 對(duì)于超長(zhǎng)數(shù)據(jù),尤其是二進(jìn)制數(shù)據(jù)(例如音頻視頻數(shù)據(jù)等),SQL Server提供了下列數(shù)據(jù)類型(可以超過(guò)8K):image,varbinary(max),text,ntext,varchar(max),nvarchar(max)
  3. 對(duì)于較小的二進(jìn)制數(shù)據(jù),可以公國(guó)DataReader或者DataSet一次性讀取。但是對(duì)于較大的二進(jìn)制數(shù)據(jù)(BLOB),例如1MB以上,如果一次性把所有數(shù)據(jù)都讀取出來(lái),就會(huì)消耗大量的程序內(nèi)存(字節(jié)數(shù)組)。因此,往往是采用分批讀取的方式進(jìn)行
  4. SqlDataReader的二進(jìn)制讀取:
    • 在ExecuteReader調(diào)用時(shí),要指定CommandBehavior.Sequentialaccess選項(xiàng),以表明通過(guò)順序的方式逐段讀取
       SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
    • GetBytes函數(shù),可以將二進(jìn)制字段中的數(shù)據(jù)逐段讀到緩沖區(qū)中
    • 應(yīng)當(dāng)優(yōu)先把BLOB字段前的其他字段讀取出來(lái),否則一旦開(kāi)始讀BLOB字段,將無(wú)法再回頭去讀之前的字段

代碼示例:

  • 數(shù)據(jù)庫(kù):采用紅皮書(shū)的示例數(shù)據(jù)庫(kù),AdventureWorks_WroxSSRS2012,使用PRoduction.ProductPhoto表,獲取其中的圖片數(shù)據(jù)信息

   

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

  • 基本定義:
    1         const int BUF_SIZE = 1024;//緩沖區(qū)大小2         static string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root";3         static SqlConnection conn = new SqlConnection(strConn);4         //優(yōu)先把BLOB字段前的其他字段讀取出來(lái),否則一旦開(kāi)始讀BLOB字段,將無(wú)法再回頭去讀之前的字段(注意此sql語(yǔ)句中字段的順序與數(shù)據(jù)庫(kù)字段順序的對(duì)比)5         static string strCmd = "SELECT ProductPhotoID,ThumbnailPhotoFileName,ThumbNailPhoto,LargePhotoFileName,LargePhoto FROM Production.ProductPhoto";6         static SqlCommand cmd = new SqlCommand(strCmd, conn);

  • 訪問(wèn)ProductPhoto表
     1         static void Main(string[] args) 2         { 3             try 4             { 5                 conn.Open(); 6                 //以SequentialAccesss方式打開(kāi)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);//將縮略圖二進(jìn)制數(shù)據(jù)寫(xiě)入磁盤(pán)文件13                     string largePhotoFileName = dr.GetString(3);//讀取大圖文件名14                     WriteLargePhotoFile(largePhotoFileName, dr);//將大圖二進(jìn)制數(shù)據(jù)寫(xiě)入磁盤(pán)文件15                 }16             }17             catch (Exception e)18             {19                 Console.WriteLine(e);20             }21             finally22             {23                 conn.Close();24             }25         }

  • 將縮略圖二進(jìn)制數(shù)據(jù)寫(xiě)入磁盤(pán)文件的函數(shù)
    1         static void WriteThumbnailPhotoFile(string fileName, SqlDataReader dr)2         {3             string path = "..//..//images//Thumbnail//" + fileName;//需要預(yù)先在項(xiàng)目文件夾中建立此目錄4             FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);5             //ThumbnailPhoto的數(shù)據(jù)比較小(沒(méi)有超過(guò)8KB),因此選擇一次性讀出,直接寫(xiě)入文件6             byte[] buf = dr[2] as byte[];7             fs.Write(buf, 0, buf.Length);8             fs.Close();9         }

  • 將大圖二進(jìn)制數(shù)據(jù)寫(xiě)入磁盤(pán)文件的函數(shù)
     1         static void WriteLargePhotoFile(string fileName, SqlDataReader dr) 2         { 3             string path = "..//..//images//Large//" + fileName;//需要預(yù)先在項(xiàng)目文件夾中建立此目錄 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的數(shù)據(jù)比較大,因此分批次讀出,分別寫(xiě)入文件 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         }

程序說(shuō)明:

需要預(yù)先在本項(xiàng)目文件夾下建立images目錄,內(nèi)有thumbnail和large子目錄,用于存放從數(shù)據(jù)庫(kù)獲取的圖片


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 毛毛片在线看 | 国产一级在线看 | 欧美中文字幕一区二区 | 国产高潮好爽受不了了夜色 | 国产91在线高潮白浆在线观看 | 91精彩在线 | 国产九九热 | 他也色在线视频 | 国产一国产一级毛片视频在线 | 天天色宗合| 国产黄色免费网站 | 欧美激情性色生活片在线观看 | 99热草| 爱福利视频网 | 污视频在线免费播放 | 男男啪羞羞视频网站 | 久久在线免费视频 | 黄色免费大片 | 56av国产精品久久久久久久 | 最新久久免费视频 | 天天草夜夜爽 | 久久国产精品久久精品国产演员表 | 国产小视频在线观看 | 久久精品av | 毛片观看网址 | 在线观看免费污视频 | 一级成人黄色片 | 精品一区二区三区在线播放 | 99精品视频免费看 | 欧美日在线观看 | 国产成人aⅴ | 久久欧美亚洲另类专区91大神 | 精品一区二区三区免费 | 中文在线观看www | 九九黄色 | 手机黄色小视频 | 一级电影在线免费观看 | 成人在线免费观看小视频 | 久久久久久久久久性 | 国产精品色在线网站 | 狼伊千合综网中文 |