읽고 청크 ADO.NET 및 Visual C# .NET을 사용하여 BLOB 열 간에 파일을 작성하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 317043 - 이 문서가 적용되는 제품 보기.
이 문서에서는 Microsoft Visual Basic .NET 버전에 317034 참조하십시오.
이 문서에서는 Visual C++ .NET 버전에 317044 참조하십시오.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Microsoft SQL Server 작 및 UPDATETEXT 문을 읽고 데이터베이스 테이블의 열에 BLOB (LongVarBinary) 에서 데이터를 쓰는 방법을 설명합니다.

네트워크 제약 조건 때문에 큰 BLOB 파일을 더 작은 청크로 및 다음 조각을 청크 함께 전체 BLOB 검색하는 대신 한 번에 파일 검색할 할 수 있습니다. 그러나 ADO.NET 데이터 공급자를 GetChunkAppendChunk 메서드를 데이터 액세스 개체 (DAO) 및 ActiveX 데이터 개체 (ADO) Recordset 개체에 사용할 수 있는 권한이 없습니다. 이 문서에서는 작은 청크 데이터를 검색할 수 있는 여러 가지 방법을 설명합니다.

메모:
  • 이 문서에서는 두 SqlClient 데이터에 대한 예가 포함되어 공급자 및 OLE DB .NET 데이터 공급자를. 클래스 이름 별도로 유일한 차이점은 연결 문자열과 SQL 매개 변수 선언이 있습니다. 작 및 UPDATETEXT 문을 검색할 수 있는 기본적인 방법은 동일합니다.
  • Northwind 샘플 데이터베이스에 존재하지 않는 범주 테이블의 테스트 레코드. 서버 탐색기를 사용하거나 테스트범주 레코드를 추가할 수 있는 다른 도구를 설정합니다. 다음 샘플에서는 사용한 후 이 레코드를 데이터베이스에서 제거할 할 수 있습니다. 레코드를 제거하려면 SQL 쿼리 분석기에서 다음 명령을 입력한 다음 F5 키를 눌러:
    use Northwind
    delete from Categories where CategoryName = 'Test'
    					

Requirements

다음 항목은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라, 기술 및 지식 및 필요한 서비스 팩의 설명합니다.
  • 서버 또는 Microsoft Windows NT 4.0 Server 고급 Microsoft Windows 2000 Professional, Windows 2000 Server는 Windows 2000
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 이상
이 문서에서는 ADO.NET을 사용하여 알고 있다고 가정합니다 기본 사항 및 구문.

Create a project and add code

  1. SQL 쿼리 분석기를 엽니다.
  2. 다음 명령을 입력한 다음 기본 데이터베이스를 변경할 수 Northwind F5 키를 눌러:
    use Northwind
  3. 다음 명령을 입력한 다음 F5 키를 눌러 Northwind 데이터베이스의 Categories 테이블에 새 레코드를 삽입할: 이 테이블에서 기존 데이터를 수정하지 않고 이 예제를 사용하려면 이 레코드를 Categories 테이블을 추가해야 할 경우에만
    Insert into categories(categoryname) values ('Test')
    노트.
  4. Visual Studio .NET에서 만든 새 Visual C# .NET Windows 응용 프로그램 프로젝트를.
  5. 다음 두 줄의 코드 System.Data.SQLClientSystem.Data.OleDb 프로젝트에 참조를 추가하려면 Form1.cs 파일 설정되지 맨 위에 추가합니다:
    using System.Data.SqlClient;
    using System.Data.OleDb;
  6. 네 개의 단추를 Form1에 추가하십시오. 단추의 Text 속성을 SQLBlob2File, OlDbBlob2File, File2OleDbBlobFile2SqlBlob 각각 변경하십시오.
  7. 다음 문자열 변수 선언 아래에 Form1 공용 클래스에 추가:
    string destfilepath;
    string sourcefilepath;
    					
  8. 폼의 Load 이벤트가 아래에 다음 코드를 붙여 넣습니다.
    destfilepath = @"c:\mytest.bmp";
    sourcefilepath = @"c:\windows\coffee bean.bmp";
    					
  9. 각 단추에 대한 Click 이벤트가 있는 프로시저를 호출하는:
    // 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에 다음 네 가지 기능을 붙여넣기:
    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를 키를 눌러 코드를 실행하고 있는지 .bmp 파일로 디스크에 쓰기 전에 SQL Server 데이터베이스에 이미지를 로드할 File2OleDbBlob 클릭합니다.

Read chunks from a BLOB column

다음 함수는 SQL Server 작은 문과 DataReader BLOB 값 단일 행, 단일 열 행 집합의 일부를 검색할 수 있습니다. 두 개의 명령이 사용됩니다: 크기 BLOB 필드 및 해당 위치에 대한 포인터를 첫 번째 검색합니다; 있는 작은 두 번째 실행하는 명령. 작은 명령 바이트 배열의 데이터 청크를 검색하고 있는 오프셋 증가시킵니다. 해당 System.IO.Filesream 개체를. 통해 디스크 쓸 바이트 배열

Write chunks to a BLOB column

다음 함수는 명령매개 변수 개체와 SQL Server UPDATETEXT 문을 데이터 청크를 바이트 배열에서 BLOB 열에 쓸 수 있습니다. TEXTPTR 검색되기 전에 단일 바이트 열에 할당됩니다 BLOB 열에 이 메서드를 사용하여 NULL이 될 수 없습니다. 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 문을 수정해야 합니다. 또한 오류 검사 쿼리가 레코드를 반환하지 않으면 추가해야 합니다.
  • 작 및 UPDATETEXT 있는 특정 Microsoft SQL Server. 다른 데이터베이스 시스템의 비슷한 명령을 사용할 수 있을 수 있습니다.

참조

읽거나 쓰고 데이터 청크 없이 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
316887읽고 ADO.NET 및 Visual Basic .NET을 사용하여 BLOB 열 간에 파일을 작성하는 방법
317017읽고 ADO.NET 및 Visual C++ .NET을 사용하여 BLOB 열 간에 파일을 작성하는 방법
317016읽기 및 ADO.NET 및 Visual C# .NET을 사용하여 BLOB 열에 위해 파일에 쓰기 방법
ADO.NET에서 BLOB 작업하는 방법에 대한 자세한 내용은 다음 MSDN) Microsoft 개발자 네트워크 (웹 사이트를 방문하십시오.
데이터베이스에서 BLOB 값 가져오기
http://msdn.microsoft.com/en-us/library/87z0hy49.aspx

속성

기술 자료: 317043 - 마지막 검토: 2004년 10월 27일 수요일 - 수정: 3.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • 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
키워드:?
kbmt kbsystemdata kbsqlclient kbhowtomaster KB317043 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. 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