如何: 讀取和使用 ADO.NET 和 Visual C++.NET 與 BLOB 資料行寫入檔案

文章翻譯 文章翻譯
文章編號: 317017 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

結論

使用此逐步教學指南,以讀取和寫入資料,與資料庫資料表中的 BLOB (LongVarBinary) 資料行。

備忘稿

本文包含範例 [SqlClient] 及 [OleDb 資料配接器 類別。[唯一] 不同及分開類別的名稱是,連接字串] 和 [SQL 參數的宣告。正在擷取 BLOB 資料的技巧基本上會相同。

類別表格中的 [測試] 記錄不存在。您必須新增一個名為測試的類別名稱。執行此動作執行以下程式碼在 Microsoft SQL Server 查詢分析:
use Northwind
Insert into categories(categoryname) values ('Test') 
				
之後使用下列的範例,您可能要從資料庫移除這筆記錄。要從資料庫中移除資料錄輸入 [SQL 查詢分析器中的 [下列的命令]。然後,按下
use Northwind
delete from Categories where CategoryName = 'Test'
					
F5。

需求

下列項目描述建議的硬體、 軟體、 網路基礎結構、 技能和知識及 Service Pack,您將需要:
  • Microsoft Windows 2000 專業版,Windows 2000 Server,Windows 2000 進階伺服器或 Windows NT 4.0 伺服器
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 7.0 (含) 以後版本
本文假設您已熟悉下列主題:
  • Visual Studio.NET
  • ADO.NET 基本原則及語法

建立專案並加入程式碼

  1. 啟動 Visual Studio.NET。
  2. 在 Visual 的.NET 2002年中建立新受管理的應用 C + + 程式。

    在 Visual 的.NET 2003年中建立一個新的主控台應用程式 (.NET)。

    命名專案"BLOBReadWrite]。
  3. BLOBReadWrite.cpp] 檔案中輸入或貼上下列程式碼]。 覆寫現有的程式碼產生的 Visual Studio.NET
       #include "stdafx.h"
       #using <mscorlib.dll>
       #using <System.dll>
       #using <System.Data.dll>
    
       using namespace System;
       using namespace System::Data;
       using namespace System::Data::SqlClient;
       using namespace System::Data::OleDb;
       using namespace System::IO;
    
       // Prototypes for functions that do the actual work.
       void File2SqlBlob(String *);
       void File2OleDbBlob(String *);
       void SqlBlob2File(String *);
       void OleDbBlob2File(String *);
    
       int direction(void);
       int reader (void);
    
       
    
       // This is the entry point for the application.
       #ifdef _UNICODE
       int wmain(void)
       #else
       int main(void)
       #endif
       {
            // File you will create from database.
            String *DestFilePath = "c:\\mytest.bmp"; 
            // File you will insert into database.
            String *SourceFilePath = "c:\\windows\\coffee bean.bmp"; 
    
    	// Insert BLOB into database from file using SQL provider.
    	File2SqlBlob(SourceFilePath); 
    
    	// Insert BLOB into database from file using OleDb provider.
    	File2OleDbBlob(SourceFilePath);
    
    	// Read BLOB from database into file using SQL provider.
    	SqlBlob2File(DestFilePath);
    
    	// Read BLOB from database into file using OleDb provider.
            OleDbBlob2File(DestFilePath); 
    
       	return 0;   
       }
    					
  4. Functions to Read from a BLOB Column] 和 [Functions to Write to a BLOB Column 區段,在本文稍後複製該函式,並將它們貼到 BLOBReadWright.cpp 檔案底端。
  5. 按下 CTRL + F5 執行程式碼。訊息會出現在確認成功的每個函式的 [主控台] 視窗中。

函式來從 BLOB 資料行讀取

下列函式會使用 DataReader 擷取 BLOB 值,並將它指派給 位元組 陣列。因為 [BLOB 處於記憶體,您不需要區塊資料 ; 設定至 位元組 陣列。有兩個 GetBytes 方法的呼叫。Rhe 第一次呼叫取得 [BLOB 的長度 (以位元組為單位),並配置 位元組 陣列。第二個呼叫會擷取資料。FileStream 物件會將 位元組 陣列寫入磁碟。
void SqlBlob2File(String *DestFilePath)
   {
	try{
        // The column number of the BLOB field.
        int PictureCol = 0; 
	SqlConnection *cn = new SqlConnection("server=localhost;integrated security=yes;database=NorthWind");
	SqlCommand *cmd = new SqlCommand("SELECT Picture FROM Categories WHERE CategoryName='Test'", cn);
	cn->Open();

	// Create server-side DataReader to read BLOB from database.
	SqlDataReader *dr  = cmd->ExecuteReader();
	dr->Read();

	// Create buffer for BLOB and read from DataReader. Close 
        // DataReader and Connection.
	Byte b[] = __gc new  Byte[Convert::ToInt32((dr->GetBytes(PictureCol, 0, 0, 0, Int32::MaxValue)))];
	dr->GetBytes(PictureCol, 0, b, 0, b->Length);
	dr->Close();
	cn->Close();

	// Open FileStream and write buffer to file.
	FileStream *fs = new FileStream(DestFilePath, FileMode::Create, FileAccess::Write);
	fs->Write(b, 0, b->Length);
	fs->Close();

	Console::WriteLine("SqlBlob2File completed successfully.\nPress return to continue.");
	Console::ReadLine();		
	}catch(SqlException *ex)
	 {Console::Write(ex->Message);}
   }

   void OleDbBlob2File(String *DestFilePath)
   {
	try{
         // The column number of the BLOB field.
	 int PictureCol = 0; 
	OleDbConnection *cn = new OleDbConnection("provider=SQLOLEDB;server=localhost;user id=user;password=pass;database=NorthWind");
	OleDbCommand *cmd = new OleDbCommand("SELECT Picture FROM Categories WHERE CategoryName='Test'", cn);
	cn->Open();

	// Create server-side DataReader to read BLOB from database.
	OleDbDataReader *dr  = cmd->ExecuteReader();
	dr->Read();

	// Create buffer for BLOB and read from DataReader. Close 
        // DataReader and Connection.
	Byte b[] = __gc new  Byte[Convert::ToInt32((dr->GetBytes(PictureCol, 0, 0, 0, Int32::MaxValue)))];
	dr->GetBytes(PictureCol, 0, b, 0, b->Length);
	dr->Close();
	cn->Close();

	// Open FileStream and write buffer to file.
	FileStream *fs = new FileStream(DestFilePath, FileMode::Create, FileAccess::Write);
	fs->Write(b, 0, b->Length);
	fs->Close();
	Console::WriteLine("OleDbBlob2File completed successfully.\nPress return to continue.");
	}catch(OleDbException *ex)
	 {Console::Write(ex->Message);}
   }
				

要寫入 BLOB 資料行的函式

下列函式會使用 指令] 和 [參數] 物件,將資料從 位元組 陣列寫入 BLOB 資料行。因為它會將檔案讀入記憶體,它不需要區塊資料,它會寫入至伺服器時。位元組 陣列和它的長度會傳遞至 參數 的建構函式。
void File2SqlBlob(String *SourceFilePath)
   {
	try{
	SqlConnection *cn = new SqlConnection("server=localhost;integrated security=yes;database=NorthWind");
	// Create SQL command containing @Picture parameter for BLOB.
	SqlCommand *cmd = new SqlCommand("UPDATE Categories SET Picture=@Picture WHERE CategoryName='Test'", cn);
			
	// Read FileStream into buffer and then close stream.
	FileStream *fs = new FileStream(SourceFilePath, FileMode::Open, FileAccess::Read);
	int size = Convert::ToInt32(fs->Length);
	Byte b[] = __gc new  Byte[size];		
	fs->Read(b, 0, size);
	fs->Close();

	// Create parameter for the @Picture contained in SQL statement.
	SqlParameter *P = new SqlParameter("@Picture", SqlDbType::VarBinary, b->Length, ParameterDirection::Input, false, 0, 0, 0, DataRowVersion::Current, b);
	cmd->Parameters->Add(P);

	// Open connection, execute query, and close connection.
	cn->Open();
	if (cmd->ExecuteNonQuery() == 1)		
	cn->Close();

	Console::WriteLine("File2SqlBlob completed successfully.\nPress return to continue.");
	Console::ReadLine();
	}catch(SqlException *ex)
	 {Console::Write(ex->Message);}
   }

   void File2OleDbBlob(String *SourceFilePath)
   {
	try{
	OleDbConnection *cn = new OleDbConnection("provider=SQLOLEDB;user id=user;password=pass;database=NorthWind");
	// Create SQL command containing ? parameter for BLOB.
	OleDbCommand *cmd = new OleDbCommand("UPDATE Categories SET Picture=? WHERE CategoryName='Test'", cn);
	
	// Read FileStream into buffer and then close stream.
	FileStream *fs = new FileStream(SourceFilePath, FileMode::Open, FileAccess::Read);
	int size = Convert::ToInt32(fs->Length);
	Byte b[] = __gc new  Byte[size];		
	fs->Read(b, 0, size);
	fs->Close();
	
	// Create parameter for the ? contained in the SQL statement.
	OleDbParameter *P = new OleDbParameter("@Picture", OleDbType::VarBinary, b->Length, ParameterDirection::Input, false, 0, 0, 0, DataRowVersion::Current, b);
	cmd->Parameters->Add(P);
	
	// Open connection, execute query, and close connection.
	cn->Open();
	if (cmd->ExecuteNonQuery() == 1)
	cn->Close();

	Console::WriteLine("File2OleDbBlob completed successfully.\nPress return to continue.");
	Console::ReadLine();
	}catch(OleDbException *ex)
	 {Console::Write(ex->Message);}
   }
				

疑難排解

  • 本文所述的程式碼可能不適合使用針對 LongVarChar 或 LongVarWChar 的資料行,而不會進行任何修改。
  • 您應該修改連接字串和 SQL 陳述式,為您的伺服器。而且,您應該加入錯誤檢查,以防您的查詢傳回任何記錄。

?考

如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
317044如何: 讀取和寫入與 BLOB 資料行的檔案使用 ADO.NET 和 C + + 中區塊
如需有關在 Visual C++.NET 中使用.NET 受管理的提供者的詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
313480.NET 資料提供者的資訊: 藍圖
如需有關使用 ADO.NET 中的 BLOB 的詳細資訊,請造訪下列 Microsoft 網站:
從資料庫取得 BLOB 值
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconobtainingblobvaluesfromdatabase.asp

屬性

文章編號: 317017 - 上次校閱: 2014年2月24日 - 版次: 3.1
這篇文章中的資訊適用於:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
關鍵字:?
kbnosurvey kbarchive kbmt kbhowtomaster kbsqlclient kbsystemdata KB317017 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:317017
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com