واحد. مقدمة:
الإجراء المخزن عبارة عن مجموعة من عبارات SQL المصممة لإكمال وظائف محددة، والتي يتم تجميعها وتخزينها في قاعدة البيانات. يقوم المستخدم بتنفيذ إجراء مخزن عن طريق تحديد اسمه وإعطاء المعلمات (إذا كان الإجراء المخزن يحتوي على معلمات). تعتبر الإجراءات المخزنة كائنًا مهمًا في قاعدة البيانات، وأي تطبيق قاعدة بيانات مصمم جيدًا يجب أن يستخدم الإجراءات المخزنة. بشكل عام، تتمتع الإجراءات المخزنة بالمزايا التالية:
◆ تسمح الإجراءات المخزنة ببرمجة المكونات القياسية
◆ يمكن أن تحقق الإجراءات المخزنة سرعة تنفيذ أكبر
◆ يمكن أن تقلل الإجراءات المخزنة من حركة مرور الشبكة
◆ يمكن استخدام الإجراءات المخزنة بالكامل كآلية أمنية
سيقدم مؤلف هذه المقالة إليك تطبيق الإجراءات المخزنة في تطبيقات قواعد بيانات .NET، وكيفية استخدامها مع كائن SqlDataAdapter، وكائن DataSet، وما إلى ذلك في ADO.NET لتحسين الأداء العام لتطبيقات قواعد بيانات .NET.
اثنين. متطلبات النظام:
أدوات التطوير:
نظام إدارة قاعدة البيانات Visual Studio.NET: SQL Server 2000 (بما في ذلك قاعدة بيانات Pubs المستخدمة في نموذج البرنامج)
3. إنشاء إجراء مخزن بسيط:
هنا سأقدم لك كيفية استخدام Visual Studio.NET IDE لإنشاء إجراء مخزن. من السهل جدًا والبديهي إنشاء إجراءات مخزنة باستخدام Visual Studio.NET IDE طالما قمت بالانتقال إلى قاعدة بيانات Pubs في مستكشف الخادم وقمت بتوسيع العقدة، فستجد كائنات قاعدة بيانات مختلفة بما في ذلك الإجراءات المخزنة، كما هو موضح في الشكل 1. يعرض.
انقر بزر الماوس الأيمن على عقدة الإجراء المخزن لتظهر قائمة تحتوي على أمر "الإجراء المخزن الجديد". بعد إنشاء إجراء مخزن جديد، سيظهر قالب التعليمات البرمجية الموضح أدناه في نافذة تحرير التعليمات البرمجية في IDE:
إنشاء الإجراء dbo.StoredProcedure1
/*
(
@parameter1 نوع البيانات = القيمة الافتراضية،
@parameter2 نوع البيانات الناتج )
*/
مثل
/* تعيين NOCOUNT على */
يعود
يتوافق قالب التعليمات البرمجية أعلاه مع قواعد بناء الجملة المبسطة لإنشاء الإجراءات المخزنة. قواعد بناء الجملة الكاملة هي كما يلي:
CREATE PROC [EDURE] الإجراء_name [ ;
[ { @parameter data_type }
[متغير] [= افتراضي] [الإخراج]
] [،...ن]
[ مع
{ إعادة الترجمة |. إعادة الترجمة , التشفير } ]
[للنسخ المتماثل]
كما sql_statement [ ... ن ]
نظرًا لضيق المساحة، لن يتم تقديم معنى كل معلمة هنا. يمكن للقراء المهتمين الرجوع إلى المعلومات حول نظام إدارة قاعدة بيانات SQL Server 2000.
أدناه سأقدم بإيجاز كل مكون نحوي في قالب التعليمات البرمجية هذا. تقوم عبارة CREATE PROCEDURE بإنشاء إجراء مخزن، متبوعًا باسم الإجراء المخزن. المكونات الموجودة في "/*...*/" هي معلمات الإجراء المخزن، والتي يمكن أن تتضمن معلمات الإدخال ومعلمات الإخراج. المحتوى الذي يتبع الكلمة الأساسية AS هو النص الرئيسي للإجراء المخزن، وهو أي عدد ونوع من عبارات SQL الموجودة في الإجراء المخزن. تشير الكلمة الأساسية RETURN إلى نهاية الإجراء المخزن ويمكنها إرجاع قيمة حالة عدد صحيح إلى المتصل. لنقم بإنشاء إجراء مخزن بسيط بدون معلمات ونستخدمه:
CREATE PROCEDURE dbo.up_GetPublisherInfo
مثل
حدد pub_id، pub_name، المدينة، الولاية، البلد
من الناشرين
يعود
بعد إنشاء الإجراء المخزن أعلاه، احفظه. بمجرد الحفظ، ستظهر العقدة المقابلة للإجراء المخزن في Server Explorer. يرجى أيضًا ملاحظة أن الكلمة الأساسية CREATE في نافذة تحرير التعليمات البرمجية قد تغيرت إلى الكلمة الأساسية ALTER، والتي تُستخدم لتغيير أي إجراءات مخزنة موجودة. لتشغيل الإجراء المخزن أعلاه، ما عليك سوى النقر على العقدة الخاصة به وتحديد "تشغيل الإجراء المخزن" في القائمة المنبثقة التي تظهر عند النقر بزر الماوس الأيمن، وتكون نتيجة العملية كما يلي:
أربعة. إنشاء إجراء مخزن باستخدام المعلمات:
قمنا أعلاه بإنشاء إجراء مخزن بسيط بدون معلمات، ولكن في التطبيقات الفعلية غالبًا ما يتم استخدام العديد من الإجراءات المخزنة مع المعلمات. تُستخدم الإجراءات المخزنة مع المعلمات بشكل عام لتحديث البيانات أو إدراج البيانات. أدناه يمكننا استخدام نفس طريقة التشغيل لإنشاء إجراء مخزن مع المعلمات:
إنشاء إجراء dbo.up_UpdatePublisherInfo
(
@pub_id شار (4)،
@pub_name فارتشار (40)،
@cityvarchar(20)،
@حالة شار (2)،
@country فارشار (30)
)
مثل
تحديث الناشرين
SET pub_name = @pub_name، المدينة = @city، الحالة = @state،
البلد = @البلد
أين ( pub_id = @pub_id )
يعود
في الكود أعلاه لإنشاء إجراء مخزن، نعلن عن معلمات المتغيرات المحلية للإجراء المخزن عن طريق إضافة علامة "@" قبل الاسم، ونعلن أيضًا عن نوع كل معلمة ونحدد قيمة الاتجاه لكل معلمة يشير إلى ما إذا كانت المعلمة هي نوع الإدخال أو نوع الإخراج أو نوع الإدخال والإخراج أو نوع قيمة الإرجاع. يمكن للمستخدمين استدعاء الإجراء المخزن من خلال اسم الإجراء المخزن المقابل والمعلمات الصحيحة والصالحة. يمكنك أيضًا إضافة معلمات الإخراج إلى المعلمات باستخدام الكلمة الأساسية OUTPUT، يرجى الرجوع إلى قواعد بناء الجملة أعلاه لمعرفة طرق محددة. يمكن لمعلمات الإخراج إرجاع المعلومات ذات الصلة إلى المتصل.
يمكن للإجراء المخزن أعلاه تحديث معلومات الناشر المقابلة في جدول الناشرين. يمكنك تنفيذه من خلال النقر على عقدة الإجراء المخزن وتحديد "تشغيل الإجراء المخزن" في القائمة المنبثقة التي تظهر عند النقر بزر الماوس الأيمن. بمجرد التنفيذ، سينبثق مربع حوار لإدخال معلومات الناشر في IDE (كما هو موضح في الشكل 3). قم بملء معلومات التحديث الصحيحة والصالحة في مربع الحوار هذا. لاحظ أن قيمة pub_id يجب أن تكون موجودة في الجدول الأصلي، ثم انقر فوق الزر "موافق" لتحديث البيانات.
خمسة. إنشاء تطبيق قاعدة بيانات باستخدام إجراء مخزن بسيط:
بعد ذلك، سنستخدم الإجراء المخزن أعلاه بدون معلمات لإنشاء تطبيق قاعدة بيانات، والذي يستخدم أيضًا كائن SqlDataAdapter وكائن DataSet في ADO.NET. يعمل كائن SqlDataAdapter كجسر بين قاعدة بيانات SQL Server وكائن DataSet لتوصيل الاثنين. يحتوي كائن SqlDataAdapter على طريقتين شائعتي الاستخدام: طريقة التعبئة () وطريقة التحديث (). يمكن لأسلوب التعبئة () الحصول على البيانات المقابلة من قاعدة البيانات وتعبئتها في كائن DataSet، كما تقوم طريقة التحديث ()، كما يوحي الاسم، بتحديث مجموعة البيانات. قبل استدعاء الأسلوب fill()، يجب علينا تعيين الخاصية SelectCommand للكائن SqlDataAdapter، وهو في الواقع كائن SqlCommand. تحتوي الخاصية SelectCommand على عبارات SQL صالحة، ويمكنها الحصول على البيانات المقابلة من قاعدة البيانات وتعبئتها في كائن DataSet.
أولا نقوم بإنشاء تطبيق Windows Forms لغة البرمجة هي C#. بعد إنشاء مشروع جديد في Visual Studio.NET، قم بإضافة فئة جديدة إلى المشروع - فئة الناشرين، والتي تتضمن منطق الأعمال الخاص بالاتصال بقاعدة البيانات الخلفية والحصول على كائن مجموعة البيانات. الخطوات هي كما يلي:
1. إضافة مراجع مساحة الاسم الضرورية: باستخدام System.Data.SqlClient
2. أضف المتغيرات الضرورية التالية إلى هذه الفئة:
Private SqlConnection cnPubs;
خاص SqlCommand cmdPubs؛
SqlDataAdapter الخاص دابوبس؛
مجموعة البيانات الخاصة dsPubs؛
3. في منشئ هذه الفئة، أكمل الاتصال بقاعدة البيانات الخلفية واحصل على كائن SqlDataAdapter ومنطق الأعمال الآخر:
public Publishers()
{
يحاول
{
// إنشاء كائن اتصال بقاعدة البيانات
cnPubs = new SqlConnection( "server=localhost;integrated Security=true;database=pubs" );
// أنشئ كائن SqlCommand وحدد نوع الأمر الخاص به كإجراء مخزن
cmdPubs = new SqlCommand();
cmdPubs.Connection = cnPubs;
cmdPubs.CommandType = CommandType.StoredProcedure;
cmdPubs.CommandText = "up_GetPublisherInfo";
// قم بإنشاء كائن SqlDataAdapter وقم بتعيين خاصية SelectCommand الخاصة به على كائن SqlCommand أعلاه
daPubs = new SqlDataAdapter();
daPubs.SelectCommand = cmdPubs;
// قم بإنشاء كائن DataSet
dsPubs = new DataSet();
}
التقاط (استثناء) {}
}
4. أخيرًا، يتم توفير طريقة GetPublisherInfo() لهذه الفئة، والتي تقوم بملء كائن DataSet بكائن SqlDataAdapter وإرجاع كائن DataSet المعبأ. الطريقة هي كما يلي (تجدر الإشارة إلى أن كائن SqlDataAdapter سيفتح اتصال قاعدة البيانات ضمنيًا. افتح اتصال قاعدة البيانات ضمنيًا بعد الحصول على البيانات. أغلق الاتصال رسميًا، مما يعني أن كائن DataSet يعمل في وضع عدم الاتصال وعندما تفتح اتصال قاعدة البيانات بشكل صريح وتحصل على البيانات، لن يقوم كائن SqlDataAdapter بإغلاق الاتصال):
مجموعة البيانات العامة GetPublisherInfo ().
{
// استدعاء أسلوب التعبئة () لكائن SqlDataAdapter وإرجاع كائن مجموعة البيانات
daPubs.Fill(dsPubs);
إرجاع dsPubs;
}
بعد الانتهاء من تصميم فئة الناشرين، نضيف عنصر تحكم DataGrid إلى النموذج الرئيسي ونستخدمه لعرض البيانات في كائن DataSet. قم أولاً بإضافة متغيرات الأعضاء التالية إلى فئة النموذج الرئيسي:
Private Publishers pubs؛
مجموعة البيانات الخاصة ds؛
بعد ذلك، قم بتعديل مُنشئ فئة النموذج الرئيسي كما يلي:
النموذج العام 1()
{
//
// مطلوب لدعم Windows Forms Designer
//
InitializeComponent();
//
// TODO: أضف أي كود مُنشئ بعد استدعاء InitializeComponent
// الحانات = الناشرين الجدد ()؛
ds = pubs.GetPublisherInfo();
dataGrid1.DataSource = ds.Tables[0];
}
بهذه الطريقة، بمجرد بدء التطبيق، سيتم عرض البيانات المقابلة التي تم الحصول عليها من قاعدة بيانات Pubs باستخدام الإجراء المخزن أعلاه بدون معلمات في عنصر تحكم DataGrid في النموذج الرئيسي، ويكون الرسم التخطيطي لتشغيل البرنامج كما يلي:
6. إنشاء تطبيق قاعدة بيانات مع إجراء مخزن مع معلمات:
أعلاه قمنا بإنشاء تطبيق مع إجراء مخزن بدون معلمات، والآن سنقوم بإنشاء تطبيق قاعدة بيانات أكثر تعقيدًا. في تطبيقات قواعد البيانات الفعلية، غالبًا ما نحتاج إلى الحصول على البيانات وتحديثها أو إدراجها أو حذفها. في هذا الوقت، نحتاج إلى استخدام الإجراءات المخزنة مع المعلمات. في نفس الوقت، عند استخدام كائن SqlDataAdapter، سنستدعي Update (). طريقة. ستكمل طريقة Update() العملية المقابلة تلقائيًا بناءً على التغييرات في كل سجل في كائن DataTable في كائن DataSet. يحتوي كائن SqlDataAdapter أيضًا على خصائص مثل UpdateCommand، وInsertCommand، وDeleteCommand، وما إلى ذلك. وهذه الخصائص هي في الواقع كائنات SqlCommand. تقوم طريقة Update() بتحديد السمات المناسبة بناءً على نوع العملية.
عند استخدام الإجراءات المخزنة مع المعلمات لإنشاء تطبيقات قاعدة البيانات، فإننا نستخدم بشكل عام فئة SqlParameter، التي تحتوي على خصائص وأساليب مختلفة تتعلق بمعلمات Sql. تتضمن الخصائص ParameterName، وSqlDBType، وDirection، وSize، وValue، وSourceColumn، وSourceVersion، وما إلى ذلك. من بينها، يتم استخدام ParameterName وSqlDBType وDirection وSize والسمات الأخرى لمطابقة المعلمات المحددة في الإجراء المخزن. على سبيل المثال، يتم استخدام كائن SqlParameter المحدد أدناه لمطابقة المعلمة "@pub_id " في الإجراء المخزن up_UpdatePublisherInfo المحدد مسبقًا.
SqlParameter updParam = new SqlParameter( "@pub_id", SqlDbType.Char, 4 );
في التعريف أعلاه، على الرغم من عدم تحديد سمة الاتجاه بشكل صريح، إلا أن قيمتها الافتراضية هي الإدخال، لذا فهي تلبي احتياجاتنا. وإذا كانت خاصية الاتجاه لكائن SqlParameter هي InputOutput أو Output أو ReturnValue، فيجب ذكر خاصية الاتجاه بوضوح على سبيل المثال، يوضح التعليمة البرمجية التالية بوضوح أن خاصية الاتجاه لكائن SqlParameter هي Output.
oParam.Direction = ParameterDirection.Output;
يتم استخدام الخاصية SourceColumn لمطابقة كائن DataColumn في كائن DataTable. يمكن أن تقوم هذه المطابقة باستيراد كائن SqlParameter المطلوب ضمنيًا عند استدعاء أسلوب Update() لتحديث كائن DataTable. إذا لم يتم التصريح عن هذه الخاصية عند التعريف، فيجب عليك ذكر خاصية SourceColumn بشكل صريح لكائن SqlParameter في التعليمات البرمجية الخاصة بك.
القيمة الافتراضية لخاصية SourceVersion هي القيمة الحالية في الحقل المقابل لكائن DataRow، وهي القيمة التي سيتم تحديثها إلى قاعدة البيانات. بالطبع، يمكن أن تشير خاصية SourceVersion أيضًا إلى القيمة الأصلية في الحقل المقابل لكائن DataRow، أي القيمة الأولية التي تم الحصول عليها من قاعدة البيانات. في نظام معالجة معاملات قاعدة البيانات، تعد مسألة مزامنة البيانات مهمة جدًا، فلنقم ببناء إجراء مخزن يمكنه اكتشاف مزامنة البيانات.
إنشاء إجراء dbo.up_UpdatePublisherName
(
@pub_id شار (4)،
@pub_name فارتشار(40)،
@Original_pub_name فارتشار(40)
)
مثل
إذا كان موجودًا (اختر pub_id
من الناشرين
حيث (pub_id = @pub_id) و(pub_name = @Original_pub_name))
يبدأ
تحديث مجموعة الناشرين pub_name = @pub_name
أين (pub_id = @pub_id)
نهاية
يعود
بعد ذلك، نستدعي الإجراء المخزن في التطبيق أعلاه لتحديث اسم الناشر. أولاً، قم بتحسين فئة منطق الأعمال-فئة الناشرين بناءً على التطبيق الأصلي:
1. قم بإضافة كائن SqlCommand جديد يمكن استخدامه كخاصية UpdateCommand للكائن SqlDataAdapter:
خاص SqlCommand cmdUpdPubs؛
2. قم بتحديث وظيفة Publishers() المُنشئة لهذه الفئة لإضافة ما يلي:
// قم بإنشاء كائن SqlCommand آخر يشير إلى الإجراء المخزن الذي يقوم بتحديث اسم الناشر
cmdUpdPubs = new SqlCommand();
cmdUpdPubs.Connection = cnPubs;
cmdUpdPubs.CommandType = CommandType.StoredProcedure;
cmdUpdPubs.CommandText = "up_UpdatePublisherName";
// أضف المعلمات الضرورية إلى كائن SqlCommand أعلاه
cmdUpdPubs.Parameters.Add( "@pub_id", SqlDbType.Char, 4, "pub_id" );
cmdUpdPubs.Parameters.Add( "@pub_name", SqlDbType.VarChar, 40, "pub_name" );
SqlParameter updParam = جديد SqlParameter
( "@Original_pub_name"، SqlDbType.VarChar، 40، "pub_name" );
updParam.SourceVersion = DataRowVersion.Original;
cmdUpdPubs.Parameters.Add( updParam );
3. حدد خاصية UpdateCommand للكائن SqlDataAdapter ككائن SqlCommand المحدد أعلاه:
daPubs.UpdateCommand = cmdUpdPubs;
4. إضافة طريقة UpdatePublisherName():
UpdatePublisherName الفراغ العام (DataSet dsChanges)
{
// تحديث كافة التغييرات
daPubs.Update(dsChanges);
}
بعد اكتمال فئة منطق الأعمال للتطبيق، أضف زرًا باسم "تحديث مجموعة البيانات" في النموذج الرئيسي، وأضف وظيفة استجابة الحدث للزر كما يلي:
زر الفراغ الخاص 1_Click(object sender, System.EventArgs e) { if ( ds.HasChanges() ) { pubs.UpdatePublisherName( ds.GetChanges() ); ds.Clear();
حتى الآن، تم تحديث فئة منطق الأعمال الخاصة بالتطبيق وفئة النموذج الرئيسي. والآن يمكن للتطبيق تحديث المحتوى ذي الصلة في قاعدة البيانات وفقًا للتغييرات التي أجراها المستخدم.
سبعة. ملخص:
تقدم لك هذه المقالة المعرفة الأساسية بالإجراءات المخزنة وكيفية دمج كائنات SqlDataAdapter وكائنات DataSet وما إلى ذلك لإنشاء تطبيقات تعتمد على البيانات في تطبيقات قواعد بيانات .NET. في هذه المقالة، استخدمنا نوعين من الإجراءات المخزنة: أحدهما إجراء مخزن بسيط بدون معلمات، وهو سهل الاستخدام نسبيًا؛ والآخر هو إجراء مخزن مع معلمات، ويجب عليك استدعاء هذا النوع من الإجراء المخزن إلى كائن SqlParameter. في الوقت نفسه، ليس من الصعب العثور على أن تغليف منطق أعمال تحديث البيانات في إجراء مخزن هو طريقة تصميم جيدة، والتي يمكنها تحسين قابلية الإدارة وقابلية التوسع وأمن قاعدة البيانات للتطبيق. وبالمثل، يمكن تغليف منطق الأعمال الخاص بإدراج البيانات وحذفها في الإجراءات المخزنة واستخدامها في التطبيقات بطريقة مماثلة. وفي النهاية أتمنى أن يكون هذا المقال ذا فائدة كبيرة للجميع.