خادم قاعدة البيانات:مؤشر النقطة من جانب الخادم؟

StackOverflow https://stackoverflow.com/questions/493000

  •  20-08-2019
  •  | 
  •  

سؤال

أرغب في قراءة البيانات الثنائية من كائن ثنائي كبير الحجم، باستخدام واجهة البث المحيطة به.

لكنني لا أريد أن يتم تحميل النقطة الكبيرة بالكامل من جانب العميل وتخزينها في الذاكرة أو في ملف.

أريد أن يكون الكود الذي يستخدم blob قادرًا على البحث والقراءة، ويتم إحضار نفس القدر من البيانات المطلوبة لدعم البحث/القراءة عبر السلك.

أي. يدّعي النقطة عبارة عن صورة Photoshop بحجم 250 ميجابايت.يعرف رمز المصغر كيفية قراءة أول 8 بايت من الصورة، والتعرف على أنه ملف PSD، والبحث عن الإزاحة التي ستحتوي على الصورة المصغرة بحجم 3K، وقراءتها.

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


بحث

كيف:قراءة ملف وكتابته من وإلى عمود BLOB باستخدام Chunking في ADO.NET وVisual Basic .NETالذي يتحدث عن القدرة على القراءة والكتابة في أجزاء.لكن الكود غير قابل للقراءة حيث يتم قطعه بحيث لا أستطيع تحمله.سوف أنظر إليه لاحقا.

أيضًا هذا الشخص ذكر SQL Server 2005 الجديد [عمود.Write()]3 بناء جملة T-SQL لكتابة البيانات - يمكن استخدامها لكتابة البيانات في أجزاء صغيرة (لتجنب استهلاك كل ذاكرة الخادم الخاص بك).ربما هناك [عمود].يقرأ() الطريقة الزائفة

مايكروسوفت لديها مقال: الحفاظ على الموارد عند كتابة قيم BLOB إلى SQL Server

هل كانت مفيدة؟

المحلول

مع الإصدارات الأحدث من SQL Server، يمكنك فقط استخدام SQL العادي مع الدالة SUBSTRING() على أنواع البيانات الثنائية بالإضافة إلى النص.يرى http://msdn.microsoft.com/en-us/library/ms187748.aspx

للحصول على حجم الصورة:

select datalength(blobcolumn) from myimages where imgid = 12345;

لقراءة أول 8 بايت:

select substring(blobcolumn, 1, 8) from myimages where imgid = 12345;

لقراءة 877 بايت، قم بإزاحة 115000 إلى 115876:

select substring(blobcolumn, 115001, 877) from myimages where imgid = 12345;

تذكر أن دالة السلسلة الفرعية تعتمد على إزاحة 1، وليس 0.

إذا كنت تهتم بالعمود الذي يحتمل أن يتغير بين أجزاء القراءة منه، فيمكنك وضع جميع التحديدات المختلفة ضمن المعاملة.

لم يتم اختبار هذا بواسطتي، ولكن يبدو أن الإصدارات الأقدم من MS SQL Server تتطلب استخدام الفعل READTEXT (المهمل الآن) ووظيفة TEXTPTR().مثل:

select textptr(blobcolumn) from myimages where imgid = 12345;

احصل على قيمة المؤشر التي تم إرجاعها، مثل PTR، واستخدمها في الاستعلامات اللاحقة:

readtext blobcolumn @PTR 115001 887

نصائح أخرى

يمكنك التفكير في استخدام ميزة Sql Server 2008 FileStream الجديدة لهذا: http://msdn.microsoft.com/en-us/library/cc645940.aspx

سوف ترغب في استخدام ADO.NET SqlDataReader كائن مع SequentialAccess CommandBehavior.سيسمح لك ذلك بتحديد حجم المخزن المؤقت وقراءة البيانات في أجزاء.

انظر هذا المقال: http://msdn.microsoft.com/en-us/library/87z0hy49(VS.71).aspx

byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top