Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để đọc và viết một tập tin đến và đi từ một BLOB cột bằng cách sử dụng chunking trong ADO.NET và Visual C#.NET

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:317043
Đối với một Microsoft Visual Basic.NET Phiên bản này viết, xem 317034.
Đối với một Microsoft Visual C++ .NET Phiên bản của bài viết này, xem 317044.
TÓM TẮT
Bài từng bước này mô tả cách sử dụng các Microsoft SQL Server READTEXT và UPDATETEXT phát biểu để đọc và ghi dữ liệu từ BLOB (LongVarBinary) cột trong một bảng cơ sở dữ liệu.

Vì mạng những hạn chế, bạn có thể phải lấy một tập tin BLOB lớn trong nhỏ hơn khối và sau đó mảnh các khối với nhau thay vì lấy BLOB toàn bộ tập tin tại một thời gian. Tuy nhiên, ADO.Các nhà cung cấp mạng dữ liệu không có GetChunkAppendChunk phương pháp có sẵn cho các dữ liệu truy nhập đối tượng (DAO) và ActiveX Dữ liệu đối tượng (ADO) RecordSet các đối tượng. Bài viết này mô tả cách khác nhau để tải về dữ liệu trong khối nhỏ hơn.

Chú ý:
  • Bài viết này chứa các ví dụ cho cả hai dữ liệu SqlClient Nhà cung cấp và OLE DB.NET dữ liệu nhà cung cấp. Sự khác biệt duy nhất, cách nhau từ lớp tên, là kết nối dây và tuyên bố của các tham số SQL. Kỹ thuật cơ bản để lấy READTEXT và UPDATETEXT phát biểu là Chúc bạn như vậy.
  • Hồ sơ kiểm tra trong thể loại của Northwind bảng mẫu cơ sở dữ liệu không tồn tại. Bạn phải sử dụng máy chủ Explorer này hay cách khác công cụ để thêm một bản ghi với các CategoryName thiết lập để Test. Sau khi sử dụng các mẫu sau đây, bạn có thể muốn loại bỏ điều này ghi lại từ cơ sở dữ liệu. Để loại bỏ hồ sơ, gõ lệnh sau trong SQL Query Analyzer, và sau đó nhấn F5:
    use Northwinddelete from Categories where CategoryName = 'Test'					

Các mục sau đây mô tả các phần cứng được giới thiệu, phần mềm, mạng cơ sở hạ tầng, kỹ năng và kiến thức, và dịch vụ gói được bắt buộc:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, hoặc máy chủ Microsoft Windows NT 4.0
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 7.0 hoặc cao hơn
Bài viết này giả định rằng bạn đã quen thuộc với ADO.NET nguyên tắc cơ bản và cú pháp.

  1. Mở SQL Query Analyzer.
  2. Gõ lệnh sau, rồi bấm phím F5 để thay đổi các mặc định cơ sở dữ liệu để Northwind:
    use Northwind
  3. Gõ lệnh sau, rồi bấm phím F5 để chèn một mới ghi lại trong thể loại của cơ sở dữ liệu Northwind bảng:
    Insert into categories(categoryname) values ('Test')
    Chú ý Bạn chỉ có thể thêm kỷ lục này thể loại bảng nếu bạn muốn sử dụng ví dụ này mà không cần sửa đổi bất kỳ dữ liệu hiện có trong điều này bảng.
  4. Trong phòng thu trực quan.NET, tạo ra một mới Visual C#.NET Windows Dự án ứng dụng.
  5. Athe đầu của tập tin Form1.cs của bạn, thêm hai dòng mã để thêm tài liệu tham khảo để dự án của bạn cho System.Data.SQLClientSystem.Data.OleDb:
    using System.Data.SqlClient;using System.Data.OleDb;
  6. Thêm bốn nút để Form1. Thay đổi các Văn bản tài sản của các nút để SQLBlob2File, OlDbBlob2File, File2OleDbBlob, và File2SqlBlob, tương ứng.
  7. Thêm khai báo biến chuỗi sau đây theo các Form1 lớp công cộng:
    string destfilepath;string sourcefilepath;					
  8. Dán đoạn mã sau dưới dạng Tải sự kiện:
    destfilepath = @"c:\mytest.bmp";sourcefilepath = @"c:\windows\coffee bean.bmp";					
  9. Gọi các thủ tục trong các Nhấp vào sự kiện cho mỗi nút:
    // 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. Dán những chức năng sau bốn năm 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. Nhấn F5 để chạy mã, và sau đó nhấp vàoFile2OleDbBlob để đảm bảo rằng bạn tải một hình ảnh trong SQL Máy chủ cơ sở dữ liệu trước khi bạn cố gắng để viết vào một tập tin .bmp trên các đĩa.

Các chức năng sau đây sử dụng các báo cáo SQL Server READTEXT và DataReader để lấy một phần của giá trị BLOB đơn-liên tiếp, đĩa đơn cột rowset. Hai lệnh được sử dụng: đầu tiên truy kích thước của lĩnh vực BLOB và một con trỏ chỉ tới vị trí của nó; Thứ hai thực hiện READTEXT bộ chỉ huy. READTEXT lệnh truy đoạn dữ liệu trong một mảng Byte và gia số một bù đắp. Mảng Byte được ghi vào đĩa thông qua các System.io.Filesream đối tượng.

Sau đây chức năng sử dụng các Chỉ huyTham số các đối tượng và tuyên bố SQL Server UPDATETEXT viết khối dữ liệu từ một mảng Byte để một BLOB cột. Cột BLOB không thể là NULL với phương pháp này, do đó, một đơn byte được gán cho các cột trước khi TEXTPTR là Lấy. Ngày đầu tiên thực hiện tuyên bố UPDATETEXT, DeleteParam.Value được thiết lập để 1. Điều này xóa các byte hiện có từ cột trước khi chèn đoạn và ngăn chặn BLOB có dữ liệu không liên quan nối thêm vào nó. Các báo cáo UPDATETEXT được thực hiện nhiều lần, incrementing đối tượng dời hình với kích thước của bộ đệm sau mỗi cuộc gọi.
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);   }}				
Chú ý
  • Các mã được mô tả trong bài viết này có thể không có thích hợp cho việc sử dụng chống lại LongVarChar hoặc LongVarWChar cột mà không có Sửa đổi.
  • Bạn phải sửa đổi các kết nối chuỗi và SQL phát biểu tương ứng với máy chủ của riêng bạn. Bạn cũng phải thêm kiểm tra nếu lỗi của bạn truy vấn trả lại không có hồ sơ.
  • READTEXT và UPDATETEXT được cụ thể cho Microsoft SQL Hệ phục vụ. Hệ thống cơ sở dữ liệu khác nhau có thể có lệnh tương tự mà bạn có thể sử dụng.
THAM KHẢO
Để thêm thông tin về làm thế nào để đọc và ghi dữ liệu mà không cần chunking, nhấp vào số bài viết sau để xem các bài viết trong cơ sở kiến thức Microsoft:
316887Làm thế nào để đọc và viết một tập tin đến và đi từ một BLOB cột bằng cách sử dụng ADO.NET và Visual Basic.NET
317017 Làm thế nào để đọc và viết một tập tin đến và đi từ một BLOB cột bằng cách sử dụng ADO.NET và Visual c + +.NET
317016 Làm thế nào để đọc và viết một tập tin để hoặc từ một BLOB cột bằng cách sử dụng ADO.NET và Visual C#.NET
Cho biết thêm thông tin về làm việc với BLOBs ở ADO.NET, ghé thăm Web site sau của Microsoft Developer Network (MSDN):
Việc lấy BLOB giá trị từ cơ sở dữ liệu
http://MSDN.Microsoft.com/en-US/Library/87z0hy49.aspx
kbblob kbnetsearch kbchunking

Cảnh báo: Bài viết này đã được dịch tự động

Thuộc tính

ID Bài viết: 317043 - Xem lại Lần cuối: 08/27/2011 20:41:00 - Bản sửa đổi: 2.0

Microsoft ADO.NET 1.1, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition

  • kbsystemdata kbsqlclient kbhowtomaster kbmt KB317043 KbMtvi
Phản hồi