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

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

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 Northwinddelete from Categories where CategoryName = 'Test'					

다음 항목은 권장되는 하드웨어, 소프트웨어, 네트워크 인프라, 기술 및 지식 및 필요한 서비스 팩의 설명합니다.
  • 서버 또는 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을 사용하여 알고 있다고 가정합니다 기본 사항 및 구문.

  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 클릭합니다.

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

다음 함수는 명령매개 변수 개체와 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
kbblob kbnetsearch kbchunking

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 317043 - 마지막 검토: 10/27/2004 18:23:41 - 수정: 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
피드백