أهم أقسام المدونة

الصفحات

الأحد، 2 أكتوبر 2016

أنواع الجداول التي يعرفها المستخدم


أنواع الجداول التي يعرفها المستخدم User-Defined Table Types:

قدم سكيويل سيرفر 2008 نوعا جديدا من المعاملات، قادرا على استقبال جدول كامل يحتوي على مجموعة صفوف، بدلا من المعاملات العادية التي تستقبل قيمة خانة منفردة في أحد الصفوف.. هذا يغنيك عن استخدام عدد كبير من المعاملات عند تعريف الإجراء المخزن، كما يغنيك عن استدعاء نفس الإجراء المخزن أكثر من مرة.. فمثلا: لو أردت كتابة إجراء مخزن يقوم بتحديث قيم 5 صفوف بها عشرة أعمدة في أحد الجداول، فإن استخدام المعاملات التقليدية سيجبرك على تعريف 10 معاملات للإجراء المخزن (واحد لكل عمود)، واستدعاء الإجراء المخزن 5 مرات لإرسال القيم إلى هذه الصفوف.. بينما إذا استخدمت معاملا جدوليا Table-Valued Parameter، فستعرف معاملا واحدا فقط للإجراء المخزن، وستستدعيه مرة واحدة فقط لتحديث الصفوف الخمسة.

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

ولاستخدام هذا النوع من المعاملات، يجب أن تقوم بتعريفه أولا في قاعدة البيانات.. بكتابة كود T-SQL وتنفيذه من نافذة الاستعلامات في مدير سيكويل SQL Management Studio.. ويستخدم الأمر CREATE TYPE لإنشاء نوع جديد في T-SQL، وذلك على الصيغة:

CREATE TYPE اسم_النوع AS  TABLE

(تعريف_الأعمدة)

دعنا ننشئ نوعا اسمه AuthorType نستطيع من خلاله تحديث صفوف جدول المؤلفين.. لفعل هذا في مدير سيكويل، اضغط اسم قاعدة البيانات Books.mdf بزر الفأرة الايمن، ومن القائمة الموضعية اضغط الأمر New Query، وفي نافذة الاستعلام اكتب الكود التالي:

CREATE TYPE AuthorType AS  TABLE

    ( ID int,

      Author nvarchar(50),

      CountryID smallint,

      Phone varchar(20),

      About nvarchar(MAX) )

من القائمة الموضعية اضغط Execute.. الآن سيظهر النوع AuthorType تحت العنصر Programmability\Types\User defined Table Types في متصفح الكائنات في مدير سيكويل سيرفر، حيث يمكنك تغيير اسمه لو أردت، كما يمكنك حذفه في أي وقت.

الآن يمكنك تعريف إجراء مخزن جديد يستخدم معاملا من هذا النوع.. لاحظ أنك لا تستطيع استخدام هذا المعامل للإخراج، كما أنك مجبر على تعريفه للقراءة فقط باستخدام الكلمة READONLY كالتالي:

CREATE PROCEDURE UpdateAuthors

    (@Rows AuthorType READONLY)

لكن كيف نتعامل مع المعامل @Rows في كود الإجراء المخزن؟

الأمر بسيط للغاية، فهذا المعامل هو جدول، ويمكنك التعامل معه في جمل SQL كأي جدول عادي.. مثلا: يمكننا تحديث الجدول Authors من الجدول @Rows باستخدام الأمر UPDATE والربط الداخلي INNER JOIN كالتالي:

 

CREATE PROCEDURE UpdateAuthors

    (@Rows AuthorType READONLY)

AS

UPDATE Authors

    SET Authors.Author = R.Author,

            Authors.CountryID = R.CountryID,

            Authors.Phone = R.Phone,

            Authors.About = R.About  

    FROM Authors INNER JOIN @Rows AS R

    ON Authors.ID = R.ID;

RETURN

 

لاحظ ضرورة تعريف اسم مستعار للجدول @Rows في المقطع FROM لتسهيل كتابة الاستعلام.. لقد منحناه هنا الاسم المستعار R.

بهذا يمكنك استخدام هذا الإجراء المخزن لتحديث قيم سجلات مؤلفين موجودين بالفعل في قاعدة البيانات، بناء على تماثل الرقم ID في السجل المرسل والسجل الأصلي.

كما يمكنك تعريف إجراء لإدراج سجلات الدول المرسل كمعامل، في جدول المؤلفين، وذلك باستخدام الأمر INSERT.. هذا هو:

CREATE PROCEDURE InsertAuthors

    (@Rows AuthorType READONLY)

AS

INSERT INTO  Authors

    (Author, CountryID, Phone, About)

SELECT R.Author, R.CountryID, R.Phone, R.About

FROM @Rows AS R

RETURN

لاحظ أنك لا تستطيع اختصار جملة الإداراج السابقة كالتالي:

INSERT INTO  Authors

SELECT R.*

FROM @Rows AS R

السبب في هذا هو أنك لا تستطيع نسخ قيمة الحقل ID من سجلات المعامل إلى سجلات الجدول الأصلي، لأن الحقل Author.ID حقل يولد تلقائيا، بينما نحن لم نعرف الحقل AuthorType.ID على أنه يولد تلقائيا.

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

DECLARE       @TEMP AuthorType;

INSERT INTO  @TEMP

SELECT R.*

FROM  @Rows AS R;

لاحظ أننا استخدمنا صيغة الإدراج المختصرة (لم نكتب أسماء الأعمدة) لأن الحقل ID لا يولد تلقائيا هنا.

بعد هذا يمكنك أن تضيف إلى الجدول @TEMP سجلات جديدة أو تعدل قيم السجلات الموجودة، ومن ثم تستخدمه في الكود كما تريد.

ويريك المشروع TableValuedParameters (المرفق داخل الملف المضغوط للكتاب) كيف تستخدم كائن الأمر Command والمعاملات لتنفيذ هذا الإجراء المخزن.. في هذا المشروع نقرأ جدول المؤلفين في قارئ بيانات من النوع OledbDataReader، ثم نرسله كمعامل ثان إلى الوسيلة SqlParameterCollection.AddWithValue لاستخدامه كمعامل للإجراء المخزن InsertAuthors، وبهذا نستطيع إضافة المؤلفين من قاعدة بيانات آكسيس إلى قاعدة بيانات سيكويل سيرفر.

لاحظ أن قارئ البيانات DataReader يجب أن يظل مفتوحا هو والاتصال الذي يستخدمه، لأن الوسيلة AddWithValue لا تنسخ السجلات من قارئ البيانات فعليا، ولا يتم نسخ هذه السجلات إلا عند استدعاء الوسيلة ExecuteNonQuery الخاصة بكائن الأمر Command الذي ينفذ الإجراء المخزن ويرسل إليه المعامل الجدول.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.