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

C#中讀取數據庫中Image數據

2022-06-13   來源: .NET編程 

  DataReader 的默認行為是在整個數據行可用時立即以行的形式加載傳入數據但是對於二進制大對象 (BLOB) 則需要進行不同的處理因為它們可能包含數十億字節的數據而單個行中無法包含如此多的數據CommandExecuteReader 方法具有一個重載它將采用 CommandBehavior 參數來修改 DataReader 的默認行為您可以將 CommandBehaviorSequentialAccess 傳遞到 ExecuteReader 方法來修改 DataReader 的默認行為以便讓 DataReader 按照順序在接收到數據時立即將其加載而不是加載數據行這是加載 BLOB 或其他大數據結構的理想方案
  
  在將 DataReader 設置為使用 SequentialAccess 時務必要注意訪問所返回字段的順序DataReader 的默認行為是在整個行可用時立即加載該行這使您能夠在讀取下一行之前按任何順序訪問所返回的字段但是當使用 SequentialAccess 時必須按順序訪問由 DataReader 返回的不同字段例如如果查詢返回三個列其中第三列是 BLOB則必須在訪問第三個字段中的 BLOB 數據之前返回第一個和第二個字段的值如果在訪問第一個或第二個字段之前訪問第三個字段則第一個和第二個字段值將不再可用這是因為 SequentialAccess 已修改 DataReader使其按順序返回數據當 DataReader 已經讀取超過特定數據時該數據將不可用
  
  當訪問 BLOB 字段中的數據時請使用 DataReader 的 GetBytes 類型化訪問器該訪問器將使用二進制數據填充 byte 數組您可以指定要返回的特定數據緩沖區大小以及從返回的數據中讀取的第一個字節的起始位置GetBytes 將返回 long 值它表示所返回的字節數如果向 GetBytes 傳遞空的 byte 數組所返回的長值將是 BLOB 中字節的總數您可以選擇將字節數組中的某索引指定為所讀取數據的起始位置
  
  以下示例從 Microsoft SQL Server 中的 pubs 示例數據庫中返回發行者 ID 和徽標發行者 ID (pub_id) 是字符字段而徽標則是圖形即 BLOB請注意由於必須按順序訪問字段所以將在訪問徽標之前訪問當前數據行的發行者 ID
  
  [Visual Basic]
  Dim pubsConn As SqlConnection = New SqlConnection(Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;)
  Dim logoCMD As SqlCommand = New SqlCommand(SELECT pub_id logo FROM pub_info pubsConn)
  
  Dim fs As FileStream Writes the BLOB to a file (*bmp)
  Dim bw As BinaryWriter Streams the binary data to the FileStream object
  
  Dim bufferSize As Integer = The size of the BLOB buffer
  Dim outbyte(bufferSize ) As Byte The BLOB byte() buffer to be filled by GetBytes
  Dim retval As Long The bytes returned from GetBytes
  Dim startIndex As Long = The starting position in the BLOB output
  
  Dim pub_id As String = The publisher id to use in the file name
  
   Open the connection and read data into the DataReader
  pubsConnOpen()
  Dim myReader As SqlDataReader = logoCMDExecuteReader(CommandBehaviorSequentialAccess)
  
  Do While myReaderRead()
   Get the publisher id which must occur before getting the logo
  pub_id = myReaderGetString()
  
   Create a file to hold the output
  fs = New FileStream(logo & pub_id & bmp FileModeOpenOrCreate FileAccessWrite)
  bw = New BinaryWriter(fs)
  
   Reset the starting byte for a new BLOB
  startIndex =
  
   Read bytes into outbyte() and retain the number of bytes returned
  retval = myReaderGetBytes( startIndex outbyte bufferSize)
  
   Continue reading and writing while there are bytes beyond the size of the buffer
  Do While retval = bufferSize
  bwWrite(outbyte)
  bwFlush()
  
   Reposition the start index to the end of the last buffer and fill the buffer
  startIndex = startIndex + bufferSize
  retval = myReaderGetBytes( startIndex outbyte bufferSize)
  Loop
  
   Write the remaining buffer
  bwWrite(outbyte)
  bwFlush()
  
   Close the output file
  bwClose()
  fsClose()
  Loop
  
   Close the reader and the connection
  myReaderClose()
  pubsConnClose()
  [C#]
  SqlConnection pubsConn = new SqlConnection(Data Source=localhost;Integrated Security=SSPI;Initial Catalog=pubs;);
  SqlCommand logoCMD = new SqlCommand(SELECT pub_id logo FROM pub_info pubsConn);
  
  FileStream fs; // Writes the BLOB to a file (*bmp)
  BinaryWriter bw; // Streams the BLOB to the FileStream object
  
  int bufferSize = ; // Size of the BLOB buffer
  byte[] outbyte = new byte[bufferSize]; // The BLOB byte[] buffer to be filled by GetBytes
  long retval; // The bytes returned from GetBytes
  long startIndex = ; // The starting position in the BLOB output
  
  string pub_id = ; // The publisher id to use in the file name
  
  // Open the connection and read data into the DataReader
  pubsConnOpen();
  SqlDataReader myReader = logoCMDExecuteReader(CommandBehaviorSequentialAccess);
  
  while (myReaderRead())
  {
  // Get the publisher id which must occur before getting the logo
  pub_id = myReaderGetString();
  
  // Create a file to hold the output
  fs = new FileStream(logo + pub_id + bmp FileModeOpenOrCreate FileAccessWrite);
  bw = new BinaryWriter(fs);
  
  // Reset the starting byte for the new BLOB
  startIndex = ;
  
  // Read the bytes into outbyte[] and retain the number of bytes returned
  retval = myReaderGetBytes( startIndex outbyte bufferSize);
  
  // Continue reading and writing while there are bytes beyond the size of the buffer
  while (retval == bufferSize)
  {
  bwWrite(outbyte);
  bwFlush();
  
  // Reposition the start index to the end of the last buffer and fill the buffer
  startIndex+= bufferSize;
  retval = myReaderGetBytes( startIndex outbyte bufferSize);
  }
  
  // Write the remaining buffer
  bwWrite(outbyte);
  bwFlush();
  
  // Close the output file
  bwClose();
  fsClose();
  }
  
  // Close the reader and the connection
  myReaderClose();
  pubsConnClose();
From:http://tw.wingwit.com/Article/program/net/201311/12026.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.