Bagaimana untuk membaca dan menulis file ke dan dari kolom GUMPALAN dengan menggunakan chunking di ADO.NET dan Visual C#.NET

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 317043 - Melihat produk di mana artikel ini berlaku.
Untuk Microsoft Visual Basic.NET versi ini Pasal, lihat 317034.
Untuk Microsoft Visual C++ .NET versi artikel ini, lihat 317044.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini selangkah demi selangkah menjelaskan cara menggunakan Microsoft SQL Server READTEXT dan UPDATETEXT pernyataan untuk membaca dan menulis data dari GUMPALAN (LongVarBinary) kolom dalam tabel database.

Karena jaringan kendala, Anda mungkin harus mengambil file GUMPALAN besar di kecil potongan dan kemudian potongan potongan bersama-sama alih-alih mengambil seluruh GUMPALAN file pada satu waktu. Namun, ADO.Penyedia data bersih tidak memiliki GetChunk dan AppendChunk metode yang tersedia untuk Data akses obyek (DAO) dan ActiveX Data Objects (ADO) Recordset objek. Artikel ini menjelaskan cara untuk mengambil data dalam potongan kecil.

Catatan:
  • Artikel ini berisi contoh untuk SqlClient Data Penyedia dan OLE DB.NET Data Provider. Satu-satunya perbedaan, terpisah dari kelas nama, string koneksi dan pernyataan SQL parameter. Teknik dasar mengambil pernyataan-pernyataan READTEXT dan UPDATETEXT Sama.
  • Catatan pengujian dalam daftar kategori Northwind database contoh tidak ada. Anda harus menggunakan Server Explorer atau lain alat untuk menambahkan catatan dengan CategoryName diatur ke Tes. Setelah Anda menggunakan contoh berikut, Anda mungkin ingin menghapus ini Catatan dari database. Untuk menghapus catatan, ketik perintah berikut di SQL Query Analyzer, dan kemudian tekan F5:
    use Northwind
    delete from Categories where CategoryName = 'Test'
    					

Persyaratan

Item berikut menjelaskan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, keterampilan, dan pengetahuan, dan layanan paket yang data diperlukan:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, atau Microsoft Windows NT 4.0 Server
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 7.0 atau yang lebih baru
Artikel ini mengasumsikan bahwa Anda sudah familiar dengan ADO.NET dasar-dasar dan sintaks.

Membuat sebuah proyek dan menambahkan kode

  1. Buka SQL Query Analyzer.
  2. Ketik perintah berikut dan tekan F5 untuk mengubah default database untuk Northwind:
    use Northwind
  3. Ketik perintah berikut dan tekan F5 untuk memasukkan baru Catatan dalam kategori tabel database Northwind:
    Insert into categories(categoryname) values ('Test')
    Catatan Anda hanya perlu menambahkan catatan ini tabel Kategori jika Anda ingin menggunakan contoh ini tanpa memodifikasi salah satu data yang ada di ini tabel.
  4. Dalam Visual Studio.NET, membuat baru Visual C#.NET Windows Aplikasi proyek.
  5. Athe atas dari file Form1.cs Anda, tambahkan baris berikut dua kode untuk menambahkan referensi ke proyek Anda untuk System.data.SQLClient dan System.data.OleDb:
    using System.Data.SqlClient;
    using System.Data.OleDb;
  6. Menambahkan empat tombol untuk Form1. Perubahan Teks properti tombol untuk SQLBlob2File, OlDbBlob2File, File2OleDbBlob, dan File2SqlBlob, masing-masing.
  7. Tambahkan string berikut Deklarasi variabel di bawah Form1 publik kelas:
    string destfilepath;
    string sourcefilepath;
    					
  8. Paste kode berikut di bawah bentuk Beban acara:
    destfilepath = @"c:\mytest.bmp";
    sourcefilepath = @"c:\windows\coffee bean.bmp";
    					
  9. Memanggil prosedur di Klik acara untuk masing-masing tombol:
    // 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. Sisipkan empat fungsi berikut dalam 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. Tekan F5 untuk menjalankan kode, dan kemudian klikFile2OleDbBlob untuk memastikan bahwa Anda memuat gambar dalam SQL Database server sebelum Anda mencoba untuk menulis ke .bmp file pada disk.

Baca potongan dari GUMPALAN kolom

Fungsi-fungsi berikut menggunakan pernyataan SQL Server READTEXT dan Hexadecimal untuk mengambil sebagian dari GUMPALAN nilai dalam baris tunggal, satu-kolom rowset. Dua perintah yang digunakan: yang pertama mengambil ukuran bidang GUMPALAN dan pointer ke lokasi; kedua mengeksekusi READTEXT perintah. Perintah READTEXT mengambil potongan data dalam Byte array dan akan menambahkan sebuah Offset. Byte array ditulis ke disk melalui System.io.Filesream objek.

Menulis potongan untuk GUMPALAN kolom

Berikut fungsi penggunaan Perintah dan Parameter objek dan pernyataan SQL Server UPDATETEXT untuk menulis potongan data dari Byte array ke kolom GUMPALAN. GUMPALAN kolom tidak dapat NULL dengan metode ini, sehingga satu byte ditugaskan ke kolom sebelum TEXTPTR Diperoleh. Pada pelaksanaan pertama UPDATETEXT pernyataan, DeleteParam.Value diatur ke 1. Ini menghapus byte ada dari kolom sebelum memasukkan bongkahan dan mencegah GUMPALAN memiliki data asing ditambahkan ke itu. Pernyataan UPDATETEXT dijalankan beberapa kali, incrementing Offset dengan ukuran buffer setelah masing-masing panggilan.
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);
   }
}
				
Catatan
  • Kode yang dijelaskan dalam artikel ini tidak dapat cocok untuk digunakan melawan LongVarChar atau LongVarWChar kolom tanpa modifikasi.
  • Anda harus memodifikasi koneksi string dan pernyataan SQL untuk terhubung ke server Anda sendiri. Anda juga harus menambahkan error memeriksa jika Anda permintaan kembali tidak ada catatan.
  • READTEXT dan UPDATETEXT adalah khusus untuk Microsoft SQL Server. Sistem database yang berbeda mungkin memiliki perintah yang sama yang Anda dapat menggunakan.

REFERENSI

Untuk informasi tambahan tentang cara untuk membaca dan menulis data tanpa Chunking, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
316887Bagaimana untuk membaca dan menulis file ke dan dari kolom GUMPALAN dengan menggunakan ADO.NET dan Visual Basic.NET
317017 Bagaimana untuk membaca dan menulis file ke dan dari kolom GUMPALAN dengan menggunakan ADO.NET dan Visual C++.NET
317016 Bagaimana untuk membaca dan menulis file ke atau dari kolom GUMPALAN dengan menggunakan ADO.NET dan Visual C#.NET
Untuk informasi lebih lanjut tentang bekerja dengan BLOBs dalam ADO.NET, kunjungi Web site Microsoft Developer Network (MSDN) berikut:
Memperoleh nilai-nilai GUMPALAN dari database
http://MSDN.Microsoft.com/en-us/library/87z0hy49.aspx

Properti

ID Artikel: 317043 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Kata kunci: 
kbsystemdata kbsqlclient kbhowtomaster kbmt KB317043 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:317043

Berikan Masukan

 

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