熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用ADO.NET 和C# 處理BLOB 數據

2013-11-13 10:20:18  來源: .NET編程 

  使用Microsoft SQL Server 存儲和檢索數據是一項與大多數應用程序相關的任務在最近的一個項目中我提出了一個新的交互手段——大數據類型或者 BLOB項目必須存儲和檢索Microsoft Word 文檔和圖像文件本文覆蓋了使用 ADONET 所完成任務的後台部分後面將會有一期專欄討論使用 ASPNET 的前台表現
  
  什麼是 BLOB?
  BLOB 是二進制大對象(binary large object)的首字母縮寫是在 SQL Server 中作為一個單一實體存儲的二進制數據集合BLOB 主要用於保存多媒體對象比如圖像視頻和聲音但是它們還可以存儲程序甚至是代碼片斷雖然 SQL Server 支持 BLOB但不是所有數據都支持
  
  訪問 BLOB 數據
  有幾種方法可以用來從 SQL Server 數據庫讀取數據首先你可以逐行讀取數據或者你可以選擇從特定列中讀取數據最簡單的方法是訪問特定的列下面我們先討論這種方法
  
  讀取 BLOB 數據要求工作在字節級幸運的是SqlDataReader 對象有一個 GetBytes 方法用於以字節方式訪問一個列的數據一旦字節被讀取它們就可以與一個 FileStream 對象組合以將 BLOB 對象保存到一個文件中下面的 C# 代碼給出了這個例子
  
  Byte[] blob = null;
  FileStream fs = null;
  const string sConn = server=(local);Initial
  Catalog=Northwind;UID=ctester;PWD=password;
  try {
  SqlConnection conn = new SqlConnection(sConn);
  SqlCommand cmd = new SqlCommand(SELECT Picture FROM Categories WHERE
  CategoryName=Builder conn);
  cnOpen();
  SqlDataReader sdr = cmdExecuteReader();
  sdrRead();
  
  blob = new Byte[(sdrGetBytes( null intMaxValue))];
  sdrGetBytes[ blob blobLength);
  sdrClose();
  connClose();
  fs = new FileStream(c:\\Builderdoc FileModeCreate FileAccessWrite);
  
  fsWrite(blob blobLength);
  fsClose();
  } catch (SqlException e){
  ConsoleWriteLine(SQL Exception: + eMessage);
  } catch (Exception e) {
  ConsoleWriteLine(Exception: + eMessage);
  }
  
  這段代碼從一個特定的數據單元(行和列的交叉點)中讀取一個 BLOB 對象注意它(通過 Using 語句)使用了SystemDataSqlClient 和SystemIO 命名空間FileStream 類的 Write 方法被用於將 BLOB 存儲到一個本地驅動器中在這種情況下我們知道正在處理的是文檔和圖像文件所以存儲它們有意義
  
  另外一種場景涉及到讀取一個數據庫記錄行這條記錄中一個列是 BLOB 類型而其它列不是SqlDataReader 對象的默認行為是只要可以得到整行數據就將傳入數據以一行記錄裝載BLOB 對象的大小使這個方法不兼容所以它們很難對待這可以通過SqlCommand 類的ExecuteReader 方法來完成你可以將CommandBehaviorSequentialAccess 傳遞給ExecuteReader 方法去修改SqlDataReader 的默認行為以取代裝載成行的數據它將按其接收數據的順序裝載數據
  
  使用SequentialAccess 的主要方面是知道字段被訪問的順序SqlDataReader 的默認行為是允許你訪問你想要訪問的任何字段但是SequentialAccess 使你以SqlDataReader 對象返回的順序訪問字段數據被順序讀取所以數據在被讀取之後它將不再可用
  
  在訪問 BLOB 字段的數據時SqlDataReader 類的GetBytesGetString 和 GetChars 方法可以用來檢索數據GetBytes 和 GetChars 允許你使用 BLOB 字段的數據填充一個數組(它們都返回 long 型數值)下面的代碼展示了它們的使用方法
  
  SqlConnection conn = null;
  SqlCommand cmd = null;
  SqlDataReader sdr = null;
  FileStream fs = null;
  BinaryWriter bw = null;
  long blob;
  byte[] outBuffer = new byte[];
  const string sConn = server=(local);Initial
  Catalog=Northwind;UID=ctester;PWD=password;
  try {
  conn = new SqlConnection(sConn);
  cmd = new SqlCommand(SELECT CategoryID Picture FROM Categories WHERE
  CategoryName=Builderconn);
  connOpen();
  sdr = cmdExecuteReader(CommandBehaviorSequentialAccess);
  while (sdrRead()) {
  id = sdrgetString();
  fs = new FileStream(c:\\Builderdoc FileModeOpenOrCreate
  FileAccessWrite);
  bw = new BinaryWriter(fs);
  blob = sdrGetBytes( startIndex outBuffer );
  while (blob == ) {
  bwWrite(outBuffer);
  bwFlush();
  startIndex += ;
  bwFlush();
  bwClose();
  fsClose();
  }
  sdrClose();
  connClose();
  } }
  
  存儲 BLOB 數據
  檢索和保存 BLOB 對象是一個很簡單的過程相反的過程在 SQL Server 中存儲 BLOB 對象也一樣簡單這裡我要指出的是前面的例子中使用了由這個例子中的代碼存儲到表中的 BLOB 數據(Builderdoc)
  
  SqlConnection conn =null;
  SqlCommand cmd = null;
  SqlParameter param = null;
  FileStream fs = null;
  const string sConn = server=(local);Initial
  Catalog=Northwind;UID=ctester;PWD=password;
  try {
  conn = new SqlConnection(sConn);
  cmd = new SqlCommand(UPDATE Categories SET Picture = @Picture WHERE
  CategoryName = Seafood conn);
  fs = new FileStream(c:\\Builderdoc FileModeOpen FileAccessRead);
  Byte[] blob = new Byte[fsLength];
  fsRead(blob blobLength);
  fsClose();
  param = new SqlParameter(@Picture SqlDbTypeVarBinary blobLength
  ParameterDirectionInput false null DataRowVersionCurrent blob);
  cmdParametersAdd(param);
  connOpen();
  cmdExecuteNonQuery();
  } catch (SqlException e){
  ConsoleWrite(SQL Exception: + eMessage());
  } catch (Exception e) {
  ConsoleWrite(Exception: eMessage());
  }
  
  示例代碼從本地文件系統插入一個 Word 文檔到數據庫中它與常規的數據庫更新操作類似然而FileStream 和 Bytes 對象用於處理將 Word 文檔插入到數據庫中另外一個變化是使用SqlParameter 對象將 BLOB 插入到數據庫字段中這就允許數據可以直接從內存寫出到數據庫中
  
  不是所有的數據都是相等的
  雖然字符串值是開發人員與數據庫交互時最常用的數據類型但是其它數據類型也經常使用比如數字和 BLOB在編程時將將這些對象視為二進制流對待
From:http://tw.wingwit.com/Article/program/net/201311/13272.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.