読み取りおよび ADO でチャンクを使用してファイルを BLOB 列を書き込む方法。NET、Visual C#。NET

文書翻訳 文書翻訳
文書番号: 317043
マイクロソフトの Visual Basic では。このバージョン記事は、 317034.
マイクロソフト ビジュアルの C++.この資料のバージョンを NET を参照してください。 317044.
すべて展開する | すべて折りたたむ

目次

概要

この資料の方法を使用するのには、データの読み書きには、Microsoft SQL Server READTEXT、UPDATETEXT ステートメントデータベース テーブルの BLOB (LongVarBinary) 列から。

ためネットワーク上の制約、小型でサイズの大きな BLOB ファイルを取得する必要があります。チャンクし、一緒のではなく、全体の BLOB を取得チャンクの情報を一度に 1 ファイルです。ただし、ADO。NET のデータ プロバイダーはありません。 GetChunkAppendChunk データ アクセス オブジェクト (DAO) および ActiveX に使用できる方法データ オブジェクト (ADO) レコード セット オブジェクト。ここにデータを取得するのには、さまざまな方法について説明します小さな塊にします。

メモ:
  • この例は、SqlClient データの両方を掲載していますプロバイダーは、OLE DB。NET のデータ プロバイダーです。離れてからの唯一の違いはクラスの名前、接続文字列と、SQL パラメーターの宣言です。READTEXT、UPDATETEXT ステートメントを取得するのには、基本的な手法です。同じです。
  • このテスト レコードを Northwind の Categories テーブルにサンプル データベースは存在しません。サーバー エクスプ ローラーまたは別を使用する必要があります。ツールを持つレコードを追加するのには、 [区分名] 設定するのには テスト.次のサンプルを使用すると、これを削除することができます。データベースからを記録します。レコードを削除するで次のコマンドを入力します。SQL クエリ アナライザーは、f5 キーを押して:
    use Northwind
    delete from Categories where CategoryName = 'Test'
    					

要件

以下に、推奨されるハードウェア、ソフトウェアを説明します。ネットワークのインフラストラクチャ、スキルと知識、および service pack は必要があります。
  • Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 のサーバー、または Microsoft Windows NT 4.0 サーバーの詳細
  • マイクロソフトの Visual Studio。NET
  • 7.0 またはそれ以降の Microsoft SQL Server
この資料では、ADO に精通するいると仮定します。NET基本事項と構文を使用します。

プロジェクトの作成し、追加株式コード

  1. SQL クエリ アナライザー] を開きます。
  2. 次のコマンドを入力しを変更するのには、F5 キーを押して、既定のデータベース Northwind をします。
    use Northwind
  3. 次のコマンドを入力し、新規を挿入するのには、F5 キーを押してくださいNorthwind データベースの Categories テーブルに記録します。
    Insert into categories(categoryname) values ('Test')
    メモ 場合は、[商品区分] テーブルにこのレコードを追加するだけである、次の使用例を変更せずに、既存のデータは、これのいずれかを使用します。テーブルです。
  4. Visual Studio で。NET では、新しい視覚 C# を作成します。NET の Windowsアプリケーションのプロジェクトです。
  5. Form1.cs ファイルの上部、次の 2 行を追加します。参照をプロジェクトに追加するコード System.Data.SQLClientSystem.Data.OleDb:
    using System.Data.SqlClient;
    using System.Data.OleDb;
  6. 4 つのボタンを Form1 に追加します。変更は、 テキスト あるボタンのプロパティ SQLBlob2File, OlDbBlob2File, File2OleDbBlob、、 File2SqlBlob、それぞれ。
  7. 次の文字列変数宣言を追加、Form1 パブリック クラス:
    string destfilepath;
    string sourcefilepath;
    					
  8. 次のコードをフォームの下にあるを貼り付けます ロード イベント:
    destfilepath = @"c:\mytest.bmp";
    sourcefilepath = @"c:\windows\coffee bean.bmp";
    					
  9. プロシージャを呼び出すは クリックしてください。 各ボタンのイベント:
    // Click event for the button labeled SqlBlob2File.
    SqlChunkBlob2File(destfilepath);
    
    // Click event for the button labeled OLDbBlob2File.
    OlDbChunkBlob2File(destfilepath);
    
    // Click event for the button labeled File2OleDbBlob.
    ChunkFile2OleDbBlob(sourcefilepath);
    
    //Click event for the button labeled File2SqlBlob.
    ChunkFile2SqlBlob(sourcefilepath);
    					
  10. Form1 に、次の 4 つの関数を貼り付けます。
    public void SqlChunkBlob2File(string DestFilePath)
    {
       try
       {
    	int PictureCol  = 0;  // position of Picture column in DataReader
    	int BUFFER_LENGTH  = 32768; // chunk size
    	SqlConnection cn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
    			
    	// Make sure Photo is non-NULL and return TEXTPTR to it.
    			
    	SqlCommand cmdGetPointer = new SqlCommand("SELECT @Pointer=TEXTPTR(Picture), @Length=DataLength(Picture) FROM Categories WHERE CategoryName='Test'", cn);
    	SqlParameter PointerOutParam = cmdGetPointer.Parameters.Add("@Pointer", SqlDbType.VarBinary, 100);
    	PointerOutParam.Direction = ParameterDirection.Output;
    	SqlParameter LengthOutParam  = cmdGetPointer.Parameters.Add("@Length", SqlDbType.Int);
    	LengthOutParam.Direction = ParameterDirection.Output;
    	cn.Open();
    	cmdGetPointer.ExecuteNonQuery();
    	if(PointerOutParam.Value == null) 
    	{
    		cn.Close();
    		// Add code to handle NULL BLOB.
    		return;
    	}
    			
    	// Set up READTEXT command, parameters, and open BinaryReader.
    			
    	SqlCommand cmdReadBinary = new SqlCommand("READTEXT Categories.Picture @Pointer @Offset @Size HOLDLOCK", cn);
    	SqlParameter PointerParam  = cmdReadBinary.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
    	SqlParameter OffsetParam  = cmdReadBinary.Parameters.Add("@Offset", SqlDbType.Int);
    	SqlParameter SizeParam  = cmdReadBinary.Parameters.Add("@Size", SqlDbType.Int);
    	SqlDataReader dr; 
    	System.IO.FileStream fs = new System.IO.FileStream(DestFilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
    	int Offset= 0;
    	OffsetParam.Value = Offset;
    	Byte []Buffer = new Byte[BUFFER_LENGTH ];
    
    			
    	// Read buffer full of data and write to the file stream.
    			
    	do
    	{
    		PointerParam.Value = PointerOutParam.Value;
    				
    		// Calculate buffer size - may be less than BUFFER_LENGTH for last block.
    				
    		if( (Offset + BUFFER_LENGTH) >= System.Convert.ToInt32(LengthOutParam.Value)) 
    			SizeParam.Value = System.Convert.ToInt32(LengthOutParam.Value) - Offset;
    		else SizeParam.Value = BUFFER_LENGTH;
    				
    		dr = cmdReadBinary.ExecuteReader(CommandBehavior.SingleResult);
    		dr.Read();
    		dr.GetBytes(PictureCol, 0, Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		dr.Close();
    		fs.Write(Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		Offset += System.Convert.ToInt32(SizeParam.Value);
    		OffsetParam.Value = Offset;
    	}while(Offset < System.Convert.ToInt32(LengthOutParam.Value));
    
    	fs.Close();
    	cn.Close();
       }
       catch(SqlException ex)
       {
       MessageBox.Show (ex.Message);
       }
    }
    
    public void OleDbChunkBlob2File(string DestFilePath)
    {
       try
       {
    	int PictureCol= 0; // Position of picture column in DataReader.
    	int BUFFER_LENGTH = 32768;// Chunk size.
    	OleDbConnection cn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
    			
    	// Make sure Photo is non-NULL and return TEXTPTR to it.
    		
    	OleDbCommand cmdGetPointer = new OleDbCommand("SELECT ?=TEXTPTR(Picture), ?=DataLength(Picture) FROM Categories WHERE CategoryName='Test'", cn);
    	OleDbParameter PointerOutParam =  cmdGetPointer.Parameters.Add("@Pointer", OleDbType.VarBinary, 100);
    	PointerOutParam.Direction = ParameterDirection.Output;
    	OleDbParameter LengthOutParam = cmdGetPointer.Parameters.Add("@Length", OleDbType.Integer);
    	LengthOutParam.Direction = ParameterDirection.Output;
    	cn.Open();
    	cmdGetPointer.ExecuteNonQuery();
    if(PointerOutParam.Value == DBNull.Value )
    	{
    		cn.Close();
    		// Add code to deal with NULL BLOB.
    		return;
    	}
    			
    	// Set up READTEXT command, parameters, and open BinaryReader.
    			
    	OleDbCommand cmdReadBinary = new OleDbCommand("READTEXT Categories.Picture ? ? ? HOLDLOCK", cn);
    	OleDbParameter PointerParam  = cmdReadBinary.Parameters.Add("@Pointer", OleDbType.Binary, 16);
    	OleDbParameter OffsetParam  = cmdReadBinary.Parameters.Add("@Offset", OleDbType.Integer);
    	OleDbParameter SizeParam  = cmdReadBinary.Parameters.Add("@Size", OleDbType.Integer);
    	OleDbDataReader dr;
    	System.IO.FileStream fs = new System.IO.FileStream(DestFilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
    	int Offset= 0;
    	OffsetParam.Value = Offset;
    	Byte[] Buffer = new Byte[BUFFER_LENGTH];
    			
    	//Read buffer full of data and write to the file stream.
    			
    	do
    	{
    		PointerParam.Value = PointerOutParam.Value;
    				
    		// Calculate buffer size - may be less than BUFFER_LENGTH for last block.
    				
    		if((Offset + BUFFER_LENGTH) >= System.Convert.ToInt32(LengthOutParam.Value))
    			SizeParam.Value = System.Convert.ToInt32(LengthOutParam.Value) - Offset;
    		else SizeParam.Value = BUFFER_LENGTH;
    				
    		dr = cmdReadBinary.ExecuteReader(CommandBehavior.SingleResult);
    		dr.Read();
    		dr.GetBytes(PictureCol, 0, Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		dr.Close();
    		fs.Write(Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
    		Offset += System.Convert.ToInt32(SizeParam.Value);
    		OffsetParam.Value = Offset;
    	}while( Offset < System.Convert.ToInt32(LengthOutParam.Value));
    
    	fs.Close();
    	cn.Close();
       }
       catch(OleDbException ex)
       {
       MessageBox.Show (ex.Message);
       }
    }
    				
  11. コードを実行しをクリックして F5 キーを押すFile2OleDbBlob SQL のイメージを読み込むことを確認するには.Bmp ファイルに書き込みする前にサーバーのデータベース、ディスク。

読み取りのチャンクから、BLOB 列

SQL Server READTEXT ステートメントは、次の関数を使用してDataReader は、単一行の BLOB 値の一部を取得するには単一列の行セットです。2 つのコマンドを使用: 最初のサイズを取得します。BLOB フィールド、およびその場所へのポインターです。2 つ目は、READTEXT を実行します。コマンドです。READTEXT コマンドをバイト配列内のデータのチャンクを取得し、オフセットをインクリメントします。バイト配列をディスクに書き込まれます、 System.IO.Filesream オブジェクトです。

BLOB をチャンクを書き込むcolumn

次の機能の使用、 コマンドパラメーター オブジェクトとチャンクを書き込む、SQL Server UPDATETEXT ステートメントデータのバイト配列から、BLOB 列にします。BLOB 列を NULL にすることはできません。TEXTPTR をされる前に 1 バイト列に割り当てられているため、このメソッドは、取得します。UPDATETEXT ステートメントの最初の実行では、 DeleteParam.Value 1 に設定されます。これは、既存のバイト列から削除します。チャンクを挿入して、BLOB は無関係なデータを防ぐことができます前に追加します。UPDATETEXT ステートメントを複数回実行、オフセット、バッファーのサイズが呼び出すたびをインクリメントします。
private void ChunkFile2SqlBlob(string SourceFilePath)
{
   try
   {
	int BUFFER_LENGTH = 32768; // Chunk size.
	SqlConnection cn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
			
	// Make sure Photo is non-NULL and return TEXTPTR to it.
		
	SqlCommand cmdGetPointer = new SqlCommand("SET NOCOUNT ON;UPDATE Categories SET Picture = 0x0 WHERE CategoryName='Test';" +
					"SELECT @Pointer=TEXTPTR(Picture) FROM Categories WHERE CategoryName='Test'", cn);
	SqlParameter PointerOutParam  = cmdGetPointer.Parameters.Add("@Pointer", SqlDbType.VarBinary, 100);
	PointerOutParam.Direction = ParameterDirection.Output;
	cn.Open();
	cmdGetPointer.ExecuteNonQuery();
		
	// Set up UPDATETEXT command, parameters, and open BinaryReader.
			
	SqlCommand cmdUploadBinary = new SqlCommand("UPDATETEXT Categories.Picture @Pointer @Offset @Delete WITH LOG @Bytes", cn);
	SqlParameter PointerParam  = cmdUploadBinary.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
	SqlParameter OffsetParam= cmdUploadBinary.Parameters.Add("@Offset", SqlDbType.Int);
	SqlParameter DeleteParam = cmdUploadBinary.Parameters.Add("@Delete", SqlDbType.Int);
	DeleteParam.Value = 1;  // delete 0x0 character
				SqlParameter BytesParam  = cmdUploadBinary.Parameters.Add("@Bytes", SqlDbType.Binary, BUFFER_LENGTH);
	System.IO.FileStream fs = new System.IO.FileStream(SourceFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
	System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
	int Offset = 0;
	OffsetParam.Value = Offset;

			
	// Read buffer full of data and execute UPDATETEXT statement.
			
	Byte [] Buffer = br.ReadBytes(BUFFER_LENGTH);
	while(Buffer.Length > 0)
	{
		PointerParam.Value = PointerOutParam.Value;
		BytesParam.Value = Buffer;
		cmdUploadBinary.ExecuteNonQuery();
		DeleteParam.Value = 0; //Do not delete any other data.
		Offset += Buffer.Length;
		OffsetParam.Value = Offset;
		Buffer = br.ReadBytes(BUFFER_LENGTH);
	}

	br.Close();
	fs.Close();
	cn.Close();
   }
   catch(SqlException ex)
   {
   MessageBox.Show (ex.Message);
   }			
}

public void ChunkFile2OleDbBlob(string SourceFilePath)
{
   try
   {	
         int BUFFER_LENGTH = 32768; // chunk size
	OleDbConnection cn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");
		
	// Make sure Photo is non-NULL and return TEXTPTR to it.
		
	OleDbCommand cmdGetPointer = new OleDbCommand("SET NOCOUNT ON;UPDATE Categories SET Picture = 0x0 WHERE CategoryName='Test';" +
				"SELECT ?=TEXTPTR(Picture) FROM Categories WHERE CategoryName='Test'", cn);
	OleDbParameter PointerOutParam = cmdGetPointer.Parameters.Add("@Pointer", OleDbType.VarBinary, 100);
	PointerOutParam.Direction = ParameterDirection.Output;
	cn.Open();
	cmdGetPointer.ExecuteNonQuery();
			
	// Set up UPDATETEXT command, parameters, and open BinaryReader.
			
	OleDbCommand cmdUploadBinary = new OleDbCommand("UPDATETEXT Categories.Picture ? ? ? WITH LOG ?", cn);
	OleDbParameter PointerParam = cmdUploadBinary.Parameters.Add("@Pointer", OleDbType.Binary, 16);
	OleDbParameter OffsetParam = cmdUploadBinary.Parameters.Add("@Offset", OleDbType.Integer);
	OleDbParameter DeleteParam   = cmdUploadBinary.Parameters.Add("@Delete", OleDbType.Integer);
	DeleteParam.Value = 1;  // delete 0x0 character
	OleDbParameter BytesParam = cmdUploadBinary.Parameters.Add("@Bytes", OleDbType.Binary, BUFFER_LENGTH);
	System.IO.FileStream fs = new System.IO.FileStream(SourceFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
	System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
	int Offset= 0;
	OffsetParam.Value = Offset;

			
	// Read buffer full of data and execute UPDATETEXT statement.
			
         Byte[] Buffer = br.ReadBytes(BUFFER_LENGTH);
	while(Buffer.Length > 0)
	{
		PointerParam.Value = PointerOutParam.Value;
		BytesParam.Value = Buffer;
		cmdUploadBinary.ExecuteNonQuery();
		DeleteParam.Value = 0;// Do not delete any other data.
		Offset += Buffer.Length;
		OffsetParam.Value = Offset;
		Buffer = br.ReadBytes(BUFFER_LENGTH);
	}

	br.Close();
	fs.Close();
	cn.Close();		
   }
   catch(OleDbException ex)
   {
   MessageBox.Show (ex.Message);
   }
}
				
メモ
  • この資料に記載されているコードがあります。列は LongVarChar または LongVarWChar を使用に適しています。変更します。
  • SQL ステートメントと接続文字列を変更する必要があります。独自のサーバーに対応します。エラーの場合はチェックを追加することもする必要があります、クエリはレコードを返しません。
  • READTEXT、UPDATETEXT、Microsoft SQL を特定します。サーバーです。同様のコマンドを行うことができます別のデータベース システムもあります。使用します。

関連情報

詳細についてはデータを読み書きする方法マイクロソフト サポート技術記事を表示するのには、次の資料番号をクリックします。
316887読み取りし、ADO を使用してファイルを BLOB 列を記述する方法です。NET と Visual Basic。NET
317017 読み取りし、ADO を使用してファイルを BLOB 列を記述する方法です。NET と Visual C を使用できます。NET
317016 ADO を使用して、ファイルまたは BLOB の列からの書き込みを読んでする方法です。NET、Visual C#。NET
Blob の処理に関する詳細についてはADO.Net については、次のマイクロソフト開発ネットワーク (MSDN) Web サイトを参照してください。
BLOB 値をデータベースから取得します。
http://msdn.microsoft.com/en-us/library/87z0hy49.aspx

プロパティ

文書番号: 317043 - 最終更新日: 2011年7月24日 - リビジョン: 5.0
キーワード:?
kbhowtomaster kbsqlclient kbsystemdata kbmt KB317043 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:317043
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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