أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية قراءة كتابة ملف من عمود BLOB باستخدام chunking في ADO.NET و Visual C# .NET

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية317043
للحصول على إصدار Microsoft Visual Basic .NET من هذه المقالة، راجع 317034.
للحصول على إصدار Microsoft Visual C++ .NET من هذه المقالة، راجع 317044.
الموجز
توضح هذه المقالة خطوة بخطوة حول كيفية استخدام عبارات Microsoft SQL Server READTEXT و UPDATETEXT للقراءة والكتابة البيانات من أعمدة BLOB (LongVarBinary) في جدول قاعدة بيانات.

لوجود قيود شبكة الاتصال قد يلزم استرداد ملف BLOB كبير في قطع أصغر ثم قطعة الملف قطع معاً بدلاً من استرداد BLOB بأكملها في وقت واحد. ومع ذلك، لا تملك موفري البيانات ADO.NET أساليب GetChunk و AppendChunk المتوفرة "كائنات الوصول إلى البيانات (DAO)" و "كائنات بيانات ActiveX (ADO) كائنات Recordset. توضح هذه المقالة الطرق المختلفة لاسترداد البيانات في قطع أصغر.

ملاحظات:
  • تحتوي هذه المقالة على أمثلة بيانات SqlClient موفر وقم موفر OLE DB .NET البيانات. الاختلافات فقط تمييزها من أسماء الفئات هي سلاسل اتصال "و" تعريف معلمات SQL. تقنية أساسي لاسترداد عبارتي READTEXT و UPDATETEXT هو نفسه.
  • سجل اختبار في جدول الفئات من Northwind نموذج قاعدة البيانات غير موجود. يجب عليك استخدام "مستكشف الملقم" أو أداة أخرى لإضافة سجل مع CategoryName تعيين اختبار. بعد استخدام نماذج التالية قد ترغب في إزالة هذا السجل من قاعدة البيانات. لإزالة السجل اكتب الأمر التالي في محلل استعلام SQL ثم انقر فوق F5:
    use Northwinddelete from Categories where CategoryName = 'Test'					

العناصر التالية تصف الأجهزة الموصى بها و برنامج ، البنية الأساسية للشبكة ، المهارات و معرفة و حزم الخدمات المطلوبة:
  • Microsoft Windows 2000 Professional, Windows 2000 Server Windows 2000 متقدمة ملقم أو ملقم Microsoft Windows NT 4.0
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 أو الأحدث
تفترض هذه المقالة كنت معتاداً على ADO.NET الأساسيات وبناء الجملة.

  1. افتح محلل استعلام SQL.
  2. اكتب الأمر التالي ثم اضغط F5 لتغيير قاعدة البيانات الافتراضية إلى Northwind:
    use Northwind
  3. اكتب الأمر التالي ثم اضغط على F5 إدراج سجل جديد في جدول الفئات من قاعدة البيانات Northwind:
    Insert into categories(categoryname) values ('Test')
    ملاحظة لديك بإضافة هذا السجل إلى جدول الفئات إذا كنت تريد استخدام هذا المثال دون تعديل أي من البيانات الموجودة في هذا الجدول فقط.
  4. في Visual Studio .NET ، إنشاء جديد Visual C# .NET Windows المشروع التطبيق.
  5. أعلى Athe Form1.cs الملف، إضافة السطرين التاليين من التعليمات البرمجية لإضافة مراجع إلى المشروع من أجل System.Data.SQLClientSystem.Data.OleDb:
    using System.Data.SqlClient;using System.Data.OleDb;
  6. إضافة أزرار الأربعة Form1. تغيير الخاصية Text الأزرار SQLBlob2FileOlDbBlob2File ، File2OleDbBlob ثم File2SqlBlob ، على التوالي.
  7. إضافة التالية سلسلة متغير تصريحات ضمن الفئة العامة Form1:
    string destfilepath;string sourcefilepath;					
  8. قم بلصق التعليمة البرمجية التالية ضمن الحدث Load النموذج:
    destfilepath = @"c:\mytest.bmp";sourcefilepath = @"c:\windows\coffee bean.bmp";					
  9. استدعاء الإجراءات في الحدث انقر لكل زر:
    // 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 التعليمات البرمجية ثم انقر فوق File2OleDbBlob للتأكد من تحميل صورة موجودة في قاعدة بيانات SQL Server قبل محاولة الكتابة إلى ملف .bmp على القرص.

الدالات التالية استخدام عبارة SQL Server READTEXT DataReader استرداد جزء من قيمة BLOB في مجموعة صفوف صف واحد, عمود واحد. يتم استخدام الأمرين: الأول يسترد حجم الحقل BLOB ومؤشر إلى موقعه; الثاني في READTEXT تنفيذ الأمر. الأمر READTEXT استرداد مجموعة البيانات في صفيف بايت ثم بزيادة إزاحة. كتابة صفيف البايت إلى القرص خلال الكائن. System.IO.Filesream

الدالات التالية استخدام الأوامر وكائنات المعلمة عبارة SQL Server UPDATETEXT لكتابة من البيانات قطع من صفيف بايت إلى عمود BLOB. يتعذر العمود BLOB NULL مع هذا الأسلوب حتى يتم تعيين ببايت واحد إلى العمود قبل استرداد TEXTPTR. يتم تعيين DeleteParam.Value على تنفيذ الأولى من العبارة UPDATETEXT إلى 1. هذا يحذف بايت الموجودة من العمود قبل إدراج في المجموعة ومنع على BLOB الحاجة البيانات الدخيلة إلحاق إليه. جملة UPDATETEXT متعددة executed أوقات تزايد الإزاحة مع حجم المخزن المؤقت بعد كل استدعاء. خاص
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 لتتوافق مع الملقم الخاص بك. يجب أيضاً إضافة تدقيق حالة الاستعلام بإرجاع أية سجلات الأخطاء.
  • READTEXT UPDATETEXT خاصة بـ Microsoft SQL Server. قد يكون لديك أنظمة قاعدة البيانات المختلفة أوامر مشابهة التي يمكنك استخدامها.
مراجع
للحصول على معلومات إضافية حول كيفية قراءة بيانات والكتابة دون chunking انقر فوق أرقام المقالات التالية لعرضها في "قاعدة المعارف لـ Microsoft:
316887كيفية قراءة كتابة ملف من عمود BLOB باستخدام ADO.NET و Visual Basic .NET
317017كيفية قراءة كتابة ملف من عمود BLOB باستخدام ADO.NET و Visual C++ .NET
317016كيفية قراءة كتابة ملف إلى أو من عمود BLOB باستخدام ADO.NET و Visual C# .NET
للحصول على مزيد من المعلومات حول العمل مع BLOBS في ADO.NET قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
الحصول على قيم BLOB من قاعدة بيانات
http://msdn.microsoft.com/en-us/library/87z0hy49.aspx
kbblob kbnetsearch kbchunking

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 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 KbMtar
تعليقات
/body>ByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">