Okuma ve ADO.NET ve Visual C# .NET'Parçalama [NULL]'ı kullanarak bir dosya için ve bir BLOB sütundan yazma hakkında

Makale çevirileri Makale çevirileri
Makale numarası: 317043 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makalenin Microsoft Visual Basic .NET sürümü için bkz: 317034.
Bu makalenin Microsoft Visual C++ .NET sürümü için bkz: 317044.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu adım adım makalede, Microsoft SQL Server READTEXT ve UPDATETEXT ifadeleri okuyup verileri bir <a0>veritabanı</a0> tablosundaki <a1>BLOB</a1> (LongVarBinary) sütunlarından nasıl kullanılacağı açıklanır.

Ağ kısıtlamaları nedeniyle, büyük bir BLOB dosyasına daha küçük boyutta ve parça birlikte tüm DAMLA almak yerine olan birimler aynı anda dosya almak zorunda kalabilirsiniz. Ancak, ADO.NET veri sağlayıcıları GetChunk ve AppendChunk yöntemlerini veri erişim nesnesi (DAO) ve ActiveX Data Objects (ADO) Recordset nesneleri için yetkiniz yok. Bu makalede, daha küçük boyutta verileri almak için farklı yöntemler anlatılmaktadır.

Notlar:
  • Bu makalede, her iki SqlClient veri örnekleri verilmektedir Provider ve OLE DB .NET veri sağlayıcısı. Tek farklılık, Sınıf isimleri dışında bağlantı dizeleri ve bildirim SQL parametreleri ' dir. Temel teknik READTEXT ve UPDATETEXT ifadeleri almak için aynıdır.
  • Test kayıt kategoriler tablosundaki Northwind örnek veritabanı yok. Sınama için CategoryName kayıtla eklemek için başka bir araç kümesi ya da Server Explorer kullanmanız gerekir. Aşağıdaki örnekleri kullanın, sonra bu kaydı veritabanından kaldırmak isteyebilirsiniz. Kaydı kaldırmak için <a0></a0>, SQL Query Analyzer'da aşağıdaki komutu yazın ve sonra F5 tuşuna basın:
    use Northwind
    delete from Categories where CategoryName = 'Test'
    					

Requirements

Aşağıdaki öğeler, önerilen donanım, yazılım, ağ altyapısı, beceriler ve bilgi ve gerekli olan hizmet paketlerini açıklamaktadır:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows Server veya Microsoft Windows NT 4.0 Server 2000 Advanced
  • Microsoft Visual Studio. NET'i
  • Microsoft SQL Server 7.0 veya sonrası
Bu makalede, ADO.NET ile ilgili bilgi sahibi olduğunuz varsayılmaktadır temelleri ve sözdizimi.

Create a project and add code

  1. SQL Query Analyzer'ı açın.
  2. Aşağıdaki komutu yazın ve varsayılan veritabanını Northwind için değiştirmek için F5 tuşuna basın:
    use Northwind
  3. Aşağıdaki komutu yazın ve yeni bir kayıt Northwind veritabanının kategoriler tablosundaki eklemek için F5 tuşuna basın:
    Insert into categories(categoryname) values ('Test')
    bu örnekte, bu tabloda varolan verileri değiştirmeden kullanmak isterseniz, bu kayıt için <a2>Kategoriler</a2> tablosunu eklemek için yalnızca sahip Not.
  4. Visual Studio. NET'te, yeni Visual C# .NET Windows oluşturma uygulama proje.
  5. Athe üst Form1.cs dosyanızın kod System.Data.SQLClient ve System.Data.OLEDB başvuruları Projenize eklemek için aşağıdaki iki satırı ekleyin:
    using System.Data.SqlClient;
    using System.Data.OleDb;
  6. Dört düğme Form1'e ekleyin. Düğmeleri, metin özelliği SQLBlob2File, OlDbBlob2File, File2OleDbBlob ve File2SqlBlob, sırasıyla değiştirin.
  7. Form1 ortak sınıfı altında aşağıdaki dize değişken bildirimlerinde ekleyin:
    string destfilepath;
    string sourcefilepath;
    					
  8. Formun Load olayı altında aşağıdaki kodu yapıştırın:
    destfilepath = @"c:\mytest.bmp";
    sourcefilepath = @"c:\windows\coffee bean.bmp";
    					
  9. Yordamlar tıklatın olayı her düğme için arayın:
    // 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'de aşağıdaki dört işlevleri yapıştırın:
    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. Kod çalıştırma tıklatın ve sonra bir .bmp dosyasını diske yazma denemeden önce SQL Server veritabanında resim yüklenemedi emin olmak için File2OleDbBlob için F5 tuşuna basın.

Read chunks from a BLOB column

Aşağıdaki işlevler, DataReader ve SQL Server READTEXT deyimi tek satır, tek sütunlu satırkümesi BLOB değerin bir kısmını almak için kullanın. Iki komut da kullanılır: ilk boyutuna BLOB alan ve konumunu gösteren bir işaretçi alır; ikinci READTEXT yürüten komut. READTEXT komut öbek bir <a0>bayt</a0> dizideki veri alır ve bir uzaklık artar. Bayt dizisinin System.IO.Filesream. aracılığıyla diske yazılır

Write chunks to a BLOB column

Aşağıdaki işlevler komut ve Parameter nesnelerini ve SQL Server UPDATETEXT ekstresi veri parçalarını baytlık bir diziden bir BLOB sütuna yazmak için kullanın. Bu nedenle, tek bir bayt için sütun TEXTPTR alınmadan önce atanan BLOB sütun, bu yöntemle, BOş olamaz. Üzerinde ilk yürütme UPDATETEXT deyiminin DeleteParam.Value 1 olarak ayarlanır. Öbek eklemeden önce varolan bayt sütunu siler ve DAMLA kendisine eklenmiş gereksiz veri oluşturulmasını engeller. Yürütülen birden çok kez, arabelleğin boyutu olan uzaklık, her çağrısından sonra artırılmıyor UPDATETEXT ifadesidir.
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);
   }
}
				
Notları
  • Bu makalede açıklanan kod karşı LongVarChar veya LongVarWChar sütunları değişiklik yapılmaksızın kullanılmak için uygun olmayabilir.
  • Bağlantı dizesini ve SQL deyimlerini, kendi sunucusuna karşılık gelecek şekilde değiştirmeniz gerekir. Ayrıca, sorgu kayıt döndürürse denetimi eklemeniz gerekir.
  • Microsoft SQL READTEXT ve UPDATETEXT özgü Server. Farklı veritabanı sistemi kullanabileceğiniz komutlar benzer olabilir.

Referanslar

Okuma ve parçalama olmadan veri yazma hakkında ek bilgi için Microsoft Knowledge Base'deki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
316887Okuma ve ADO.NET ve Visual Basic .NET kullanarak bir dosya için ve bir BLOB sütundan yazma hakkında
317017Okuma ve ADO.NET ve Visual C++ .NET kullanarak bir dosya için ve bir BLOB sütundan yazma hakkında
317016Nasıl okuyup bir dosya veya bir BLOB sütun için ADO.NET ve Visual C#. NET'i kullanarak
BLOB'lar, ADO.NET ile çalışma hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:
BLOB değerlerinin bir veritabanından alma
http://msdn.microsoft.com/en-us/library/87z0hy49.aspx

Özellikler

Makale numarası: 317043 - Last Review: 27 Ekim 2004 Çarşamba - Gözden geçirme: 3.3
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbmt kbsystemdata kbsqlclient kbhowtomaster KB317043 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:317043

Geri Bildirim Ver

 

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