منتدى مبرمجي ASP.NET

 اسم العضو:عبدالله جابر شقليه  الأحد,09/ذو الحجة/1426 هـ,03:51 مساءً
السلام عليكم ورحمة الله وبركاته سوف أقوم بوضع لكم دروس لكيفية ربط الأوراكل مع ال asp.net لكيفية التعامل مع [COLOR=blue]procedure و function[/COLOR] الأوراكل. لعملية ربط الأوراكل مع ال [COLOR=blue]asp.net [/COLOR]سوف نقوم باستخدما [COLOR=blue]namespace(System.Data.OracleClient)[/COLOR]  والتي تتعامل مع اصدار أوراكل 9i وما فوق. وهنا سوف أضع لكم الكلاسس التي سوف نتعامل بها من خلال [COLOR=blue]System.Data.OracleClient[/COLOR]. [COLOR=red]1-OracleCommand:[/COLOR]هي مجموعة من جمل ال [COLOR=blue]sql[/COLOR] من [COLOR=blue]stored procedure [/COLOR]يتم تنفيذها على قاعدة بيانات الأوراكل. [COLOR=red]2-OracleConnection:[/COLOR]تستخدم لفتح الاتصال مع قاعدة بيانات الأوراكل وغلقها. [COLOR=red]3-OracleParameter:[/COLOR]وهي المتغيرات التي يتم إسنادها إلى [COLOR=blue]OracleCommand[/COLOR] من أجل وضع القيم للحقول. [COLOR=red]4-OracleParameterCollection:[/COLOR] تحتوي على مجموعة من المتغيرات. [COLOR=red]5-OracleType:[/COLOR] يتم من خلالها تحديد نوع حقول المتغيرات المسندة إلى OracleCommand وتركيبها. عندما تود الاتصال بقاعدة بيانات الأوراكل يجب أن يتم إضافة ملف ال DLL إلى المشروع وهو [COLOR=blue]System.Data.OracleClient.dll[/COLOR] ، ويتم إضافته كما هو موضع في الصور التالية: 1- اذهب إلى [COLOR=blue]Solution Exploer [/COLOR] ثم قوم بالضغط بالزر الأيمن على المشورع وقوم باختيار Add reference كما في الصورة التالية: [ALIGN=center][IMG]http://www.arabmoheet.net/forum/Members_Upload_Pics/1/add%20reference%20System.Data.OracleClient.JPG[/IMG][/ALIGN] 2- سوف تظهر لك نافذة جديدة ، اذهب إلى [COLOR=blue]tab[/COLOR] وقوم باختيار .[COLOR=blue]NET[/COLOR] واختار منها [COLOR=blue]System.Data.OracleClient، [/COLOR]كما في الصورة التالية: [ALIGN=center][IMG]http://www.arabmoheet.net/forum/Members_Upload_Pics/1/System.Data.OracleClient.JPG[/IMG][/ALIGN]الآن لاستخدام ال [COLOR=blue]name space (System.Data.OracleClient)[/COLOR] ضمن مشروعك قوم بعمل imports System.Data.OracleClient كالتالي: [CODE]using System.Data.OracleClient;'C# Imports System.Data.OracleClient 'VB.NET[/CODE] قوم بإضافة الاتصال بقاعدة البيانات كالتالي: [CODE]OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;");'C# Dim conn As OracleConnection = New OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;") 'VB.NET[/CODE] في المشاركة التالية سوف أقوم بشرح كيف يتم عمل عمليات على ال Oracle باستخدام ال procedure وال function.  

 اسم العضو:عبدالله جابر شقليه  الأحد,09/ذو الحجة/1426 هـ,04:12 مساءً
الآن سوف أقوم بوضع مثال من أجل كيفية إرجال البيانات من Stored procedure. قوم بإنشاء ال procedure التاالية من أجل إرجاع مجموع السجلات: [CODE language="sql"]CREATE OR REPLACE PROCEDURE count_arabmoheet_members ( reccount OUT NUMBER ) IS BEGIN SELECT COUNT(*) INTO reccount FROM members; END count_arabmoheet_members;[/CODE] لكيفية إسترجاع مجموع السجلات المرجعة من ال Stored procedure. 1- قوم بإنشاء الكائن [COLOR=blue]OracleCommand[/COLOR]، حيث يتم وضع به خاصية ال [COLOR=blue]Connection[/COLOR] وال [COLOR=blue]CommandText[/COLOR] لإسناد لها اسم ال Stored procedure و والخاصية [COLOR=blue]CommandType.StoredProcedure، [/COLOR]كالتالي: [CODE]'C# OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "count_arabmoheet_members"; cmd.CommandType = CommandType.StoredProcedure; 'Vb.NET Dim cmd As OracleCommand = New OracleCommand cmd.Connection = conn cmd.CommandText = "count_arabmoheet_members" cmd.CommandType = CommandType.StoredProcedure[/CODE] 2- سوف نقوم بإنشاء الكائن [COLOR=blue]OracleParameter[/COLOR] والذي يستخدم من أجل إدخال القيم واستخراجها إلى [COLOR=blue]Stored procedure، [/COLOR]كالتالي: [CODE]'C# cmd.Parameters.Add("reccount", OracleType.Number); cmd.Parameters["reccount"].Direction = ParameterDirection.Output; 'VB.NET cmd.Parameters.Add("reccount", OracleType.Number) cmd.Parameters("reccount").Direction = ParameterDirection.Output[/CODE] كما تشاهدون أنه تم وضع متغير [COLOR=red]reccount[/COLOR] وهو المتغير الذي تم تعريفه في Stored procedure(count_arabmoheet_members) والذي يحمل مجموع السجلات المرجعة من عملية الاستعلام، وتم وضعه له ال direction قيمته ParameterDirection.Output أي أن عباره عن متغير يحتوي على نتائج مرجعه من ال Stored procedure. ومن أجل الحصول على المستخرجات يمكنكم بناء [COLOR=blue]DataSet, DataTable, or DataReader [/COLOR]ولكن في مثالنا هذا لن نحتاج لاستخدامهم لأنه فقط قيمة واحده التي سوف تعود لنا وهي عدد السجلات فلذلك سوف نستخدم فقط الأمر [COLOR=blue]ExecuteNonQuery[/COLOR]، كالتالي: [CODE]'C# conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); 'VB.NET conn.Open cmd.ExecuteNonQuery conn.Close[/CODE] من أجل طباعة عدد السجلات كالتالي: [CODE]'C# response.write (cmd.Parameters["reccount"].Value); 'VB.NET response.write(cmd.Parameters("reccount").Value)[/CODE] في الدرس التالي سوف أقوم بوضع ما هي ال [COLOR=blue]Methods[/COLOR] المستخدمه لاستخراج البيانات في الكلاسس OracleCommand.  

 اسم العضو:عبدالله جابر شقليه  الأحد,09/ذو الحجة/1426 هـ,04:47 مساءً
سوف أقوم الآن بسرد لكم ال [COLOR=blue]Methods [/COLOR]المستخدمه لإسترجاع الباينات من الكلاسس [COLOR=blue]OracleCommand:[/COLOR] [COLOR=sienna]1[/COLOR][COLOR=green]-[/COLOR][COLOR=blue]ExecuteReader:[/COLOR]تستخدم لبناء [COLOR=blue]OracleDataReader [/COLOR]عن طريق تنفيذ ال [COLOR=blue]Stored procedure [/COLOR]لاسترجاع مجموعه من البيانات. [COLOR=sienna]2[/COLOR][COLOR=green]-[/COLOR][COLOR=blue]ExecuteNonQuery:[/COLOR]تستخدم لتنفيذ الاستعلام وال [COLOR=blue]procedure [/COLOR]التي لا تسترجع مجموعة من السجلات فقط التي تسترجع عدد السجلات التي تم التأثير عليها. [COLOR=sienna]3[/COLOR][COLOR=green]-[/COLOR][COLOR=blue]ExecuteOracleNonQuery:[/COLOR]تستخدم لتنفيذ الاستعلام لاسترجاع عدد السجلات التي تم التأثير عليها، وهذه ال [COLOR=blue]method [/COLOR]تستخدم أيضاً [COLOR=blue]OracleString parameter [/COLOR]من أجل استرجاع قيمة [COLOR=blue]ID [/COLOR]لآخر سجل تم التعديل عليها عن طريق [COLOR=green]([/COLOR][COLOR=blue]UPDATE, INSERT, or DELETE ).[/COLOR] [COLOR=sienna]4[/COLOR][COLOR=green]-[/COLOR][COLOR=blue]ExecuteScalar:[/COLOR]تستخدم لاسترجاع قيمة أول حقل من أول سجل من مجموعى النتائج وتكون البيانات من نوع [COLOR=green]([/COLOR][COLOR=blue]NET Framework).[/COLOR] [COLOR=sienna]5[/COLOR][COLOR=green]-[/COLOR][COLOR=blue]ExecuteOracleScalar: [/COLOR]تستخدم مثل [COLOR=blue]ExecuteScalar [/COLOR]لكن يكون نوع البيانات على هيئة [COLOR=blue]OracleType [/COLOR]التي يتم تحديها. [COLOR=red]ملاحظة:[/COLOR] المنهج ExecuteOracleNonQuery() من الكلاس OracleCommand المستخدمة لتنفيذ جمل الاستعلام وال Stored procedure التي لا تقوم باسترجاع أي سجل، هذا المنهج يوقم باسترجاع قيمة من نوع int متمثلة من خلال عدد السجلات التي تم التأثير عليها من خلال الأوامر (UPDATE, INSERT, and DELETE) غير ذلك تقوم باسترجاع -1،اذا قمت بتنفيذ جمله استعلام سواء " ادخال, حذف,تعديل" وهذه الجمله قامت بالتعديل على او اضافه سجل " واحد " فقط , فان هذه الMethod تسترجع لك جمله OracleString لها رقم Uniquely "مميز" تستطيع من خلال الرقم هذا ان تستطيع التعرف على هذا السجل وتتمكن من معرف التغيير الذى احدثه فى قاعدة البيانات،يمكنك استخدام هذه القيمه لتحسين اداء الsubsequent المتعلقه بتلك الqueries أيضا يمكنكم استخدام المنهج ExecuteNonQuery() والتي تعمل مثل ExecuteOracleNonQuery() لكنها لا تقوم باسترجاع (unique row identifier) كما سبق وذكرته لكم في الأعلى.  

 اسم العضو:عبدالله جابر شقليه  الأحد,09/ذو الحجة/1426 هـ,05:25 مساءً
المثال التالي سوف نقوم بعمل Stored procedure من أجل حذف بعض السجلات من جدول ال Topci عن طريق اسناد قيمة واحده لـ procedure، والتي لن تسترجع أي بيانات: [CODE language="sql"]CREATE OR REPLACE PROCEDURE delete_topic ( T_no NUMBER ) IS BEGIN DELETE FROM topic WHERE topic_no = T_no; END delete_topic;[/CODE]وهذا الكود التالي من أجل تنفيذ ال Stored procedure في الدوت نت: [CODE]'C# OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;"); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "delete_topic"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("T_no", OracleType.Number).Value = 102; conn.Open(); int rowsAffected = cmd.ExecuteNonQuery(); conn.Close(); response.write ("عدد السجلات التي تم التأثير عليها: " + rowsAffected); 'VB.NET Dim conn As OracleConnection = New OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;") Dim cmd As OracleCommand = New OracleCommand cmd.Connection = conn cmd.CommandText = "delete_topic" cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("T_no", OracleType.Number).Value = 102 conn.Open Dim rowsAffected As Integer = cmd.ExecuteNonQuery conn.Close response.write("عدد السجلات التي تم التأثير عليها: " + rowsAffected)[/CODE]  

 اسم العضو:عبدالله جابر شقليه  الأحد,09/ذو الحجة/1426 هـ,05:38 مساءً
عندما نود أن نقوم باسرجاع قيمة واحد من لقيمة حقل من خلال الاستعلام يجب أن نستخدم لذلك ال Function وليس ال Stored procedure لأنها لا تقوم باسترجاع القيم كما التي يتم استخدامها في T-SQL. المثال التالي سوف نقوم بإنشاء Function من أجل إرجاع قيمة واحده فقط كالتالي: [CODE language="sql"]CREATE OR REPLACE FUNCTION get_members_email ( p_members_no NUMBER ) RETURN VARCHAR2 IS p_email VARCHAR2(25); BEGIN SELECT EMAIL INTO p_email FROM members WHERE members_no = p_members_no; RETURN p_email; END get_members_email;[/CODE] ولتنفيذ ال Function في الدوت نت يتم تنفيذها مثل عند استخدام ال Stored procedure، ونستخدم معها ParameterDirection.ReturnValue من أجل عملية استرجاع البيانات من خلال ال Function، وشاهدو الكود التالي للقيام بذلك: [CODE]'C# OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;"); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "get_members_email"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("p_members_no", OracleType.Number).Value = 101; cmd.Parameters.Add("p_email", OracleType.VarChar, 25).Direction =ParameterDirection.ReturnValue; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); response.write ("عنوان البريد الإلكتروني: " + cmd.Parameters["p_email"].Value); 'VB.NET Dim conn As OracleConnection = New OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;") Dim cmd As OracleCommand = New OracleCommand cmd.Connection = conn cmd.CommandText = "get_members_email" cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("p_members_no", OracleType.Number).Value = 101 cmd.Parameters.Add("p_email", OracleType.VarChar, 25).Direction = ParameterDirection.ReturnValue conn.Open cmd.ExecuteNonQuery conn.Close response.write("عنوان البريد الإلكتروني: " + cmd.Parameters("p_email").Value)[/CODE] وفي الدروس القادمة سوف أقوم بشرح كيف ستم استرجاع مجموعة من السجلات وذلك عن طريق استخدام REF CURSORS ضمن ال Packages. 

 اسم العضو:عبدالله جابر شقليه  الاثنين,10/ذو الحجة/1426 هـ,05:59 مساءً
[COLOR=blue]Result Sets and REF CURSORS[/COLOR] تستخدم ال [COLOR=blue]REF CURSOR data type [/COLOR]للعمل مع مجموعة نتائج ال [COLOR=blue]Oracle.[/COLOR] ال [COLOR=blue]REF CURSOR [/COLOR]عباره عن مؤشر من خلال استرجاع السجلات في بيئة [COLOR=blue]PL/SQL query، [/COLOR]وهي ليست كأي مؤشر عادي، حيث أنها تعتبر كمتغير، وهو مرجع للمؤشر الذي تستطيع من خلاله الربط مع نتائج سجلات مختلفة خلال عملية التنفيذ. استخدام [COLOR=blue]REF CURSOR [/COLOR]كمتغير خارجي لتمرير قيم السجلات من بنية [COLOR=blue]Oracle [/COLOR]إلى البرنامج التطبيقي المستخدم. يتم تعريف المتغير الخارجي من خلال [COLOR=blue]OracleType.Cursor [/COLOR]في عملية الاستدعاء من خلال البرنامج التطبيقي للوصول إلى سجلات النتائج المؤشر عليها من خلال [COLOR=blue]REF CURSOR.[/COLOR] ال [COLOR=blue]OracleConnection [/COLOR]يجب يجب أن تبقى مفتوحة خلال استخدام ال [COLOR=blue]REF CURSOR.[/COLOR] [COLOR=blue]Packages[/COLOR] ال [COLOR=blue]Packages [/COLOR]هي عبارة عن تعريف مسبق لمجموعة من ال [COLOR=blue]procedures [/COLOR]و ال [COLOR=blue]Funcation [/COLOR]التي تستطيع استخدامها فيما بعد في برنامجك التطبيقي. المفهوم العام باستخدامه من خلال إنشاء أوامر ال [COLOR=blue]PL/SQL [/COLOR]والتي تستطيع بناء ال [COLOR=blue]Packages [/COLOR]ومحتوياته من ال [COLOR=blue]procedures [/COLOR]و ال [COLOR=blue]Funcation [/COLOR]واستخدامها لاحقاً في برنامجك من خلال الاستدعاء لاسم [COLOR=blue]Package [/COLOR]ومن ثم التحديد على أي ل [COLOR=blue]procedures [/COLOR]أو ال [COLOR=blue]Funcation [/COLOR]المراد الوصول لها. قد لا تجد مكافئ لي ال [COLOR=blue]Packages [/COLOR]في أي برنامج قواعد بيانات آخر حيث أنك لن تجدها من خلال استخدام [COLOR=blue]T-SQL.[/COLOR] ال [COLOR=blue]Packages [/COLOR]بها جزئين مهمين: [COLOR=sienna]1[/COLOR][COLOR=green]-[/COLOR] [COLOR=blue]Specification (or spec): [/COLOR]وهي عبارة عن مجمع لي تعريف مجموعة من ال [COLOR=blue]procedures [/COLOR]و ال [COLOR=blue]Funcation، [/COLOR]وفي منطقة ال [COLOR=blue]Header [/COLOR]يتم تعريف مجموعة من المتغيرات التي سيتم استخدامها خلال كتابة ال [COLOR=blue]procedures [/COLOR]و ال [COLOR=blue]Funcation، [/COLOR]ولكي تكون الأمور أكثر وضوحا نستطيع أن نشبه ال [COLOR=blue]Package [/COLOR]بأي [COLOR=blue]class [/COLOR]مشابهة في لغة ال [COLOR=blue]C [/COLOR]و [COLOR=blue]C++.[/COLOR] [COLOR=sienna]2[/COLOR][COLOR=green]-[/COLOR] [COLOR=blue]Body:[/COLOR]هو الذي يحتوي على ال [COLOR=blue]procedures [/COLOR]و ال [COLOR=blue]Funcation [/COLOR]التي سنقوم بكتابتها والمعرفة سابقا في ال [COLOR=blue]Header.[/COLOR] والأن سنقوم بتوضيح أنوع المتغيرات االتي سوف تستخدم من خلال كتابة ال [COLOR=blue]procedures [/COLOR]أو ال [COLOR=blue]Funcation، [/COLOR]وهم ثلاث أنواع كالتالي: [COLOR=sienna]1[/COLOR][COLOR=green]-[/COLOR][COLOR=blue]IN:[/COLOR]وهوي عباره عن متغيرات يتم إدخالها من خلال البرنامج التطبيقي إلى ال [COLOR=blue]procedures [/COLOR]أو ال [COLOR=blue]Funcation [/COLOR]من خلال استخدام لغة ال [COLOR=blue]PL/SQL([/COLOR]كطريقة تمرير قيمة إلى متغير داخل ل [COLOR=blue]procedures [/COLOR]أو ال [COLOR=blue]Funcation [/COLOR]لاستدعائه[COLOR=green])[/COLOR]. [COLOR=sienna]2[/COLOR][COLOR=green]-[/COLOR] [COLOR=blue]OUT:[/COLOR]هي القيمة التي يتم تصديرها من خلال ال [COLOR=blue]procedures [/COLOR]أو ال [COLOR=blue]Funcation [/COLOR]إلى البرنامج التطبيقي. [COLOR=sienna]3[/COLOR][COLOR=green]-[/COLOR] [COLOR=blue]INOUT:[/COLOR]هي المتغير الذي يتم تمرير إمن خلال البرنامج التطبيقي لى ال [COLOR=blue]procedures [/COLOR]أو ال [COLOR=blue]Funcation [/COLOR]ومن ثم يتم التعديل عليها داخل [COLOR=blue]Packages [/COLOR]وإرجاع القيمة مرة آخرى إلى البرنامج التطبيقي. وفي الدرس القادم سوف أتطرق لوضع أمثلة حول ما تم توضيحية أعلاه. 

 اسم العضو:عبدالله جابر شقليه  الاثنين,10/ذو الحجة/1426 هـ,06:13 مساءً
في المثال التالي سوف أقوم بوضع لكيفية استخدام ال package لكيفية تعريف بها مجموعة من ال Stored procedure وال Function: [CODE language="sql"]CREATE OR REPLACE PACKAGE CRUD_LOCATIONS AS TYPE T_CURSOR IS REF CURSOR; PROCEDURE GetLocations (cur_Locations OUT T_CURSOR); PROCEDURE UpdateLocations (p_location_id IN NUMBER, p_street_address IN VARCHAR2, p_postal_code IN VARCHAR2, p_city IN VARCHAR2, p_state_province IN VARCHAR2, p_country_id IN CHAR); PROCEDURE DeleteLocations (p_location_id IN NUMBER); PROCEDURE InsertLocations (p_location_id OUT NUMBER, p_street_address IN VARCHAR2, p_postal_code IN VARCHAR2, p_city IN VARCHAR2, p_state_province IN VARCHAR2, p_country_id IN CHAR); END CRUD_LOCATIONS;[/CODE] وهذا ما يتم تعريفه داخل ال package Header. والمثال التالي يوضح ألية استخدام التعريفات داخل ال Header وبرمجتها داخل ال Body: [CODE language="sql"] CREATE OR REPLACE PACKAGE BODY CRUD_LOCATIONS AS ---إسترجاع البيانات من خلال REF CURSOR------- PROCEDURE GetLocations (cur_Locations OUT T_CURSOR) IS BEGIN OPEN cur_Locations FOR SELECT * FROM LOCATIONS; END GetLocations; -------------التعديل على البيانات-------------- PROCEDURE UpdateLocations (p_location_id IN NUMBER, p_street_address IN VARCHAR2, p_postal_code IN VARCHAR2, p_city IN VARCHAR2, p_state_province IN VARCHAR2, p_country_id IN CHAR) is update Locations set street_address=p_street_address, postal_code=p_postal_code,city=p_city, state_province=p_state_province, country_id=p_country_id where location_id=p_location_id; end UpdateLocations; --------حذف البيانات-------- PROCEDURE DeleteLocations (p_location_id IN NUMBER) is delete from Locations where location_id=p_location_id; end DeleteLocations; -----إضافة البيانات-------------------- PROCEDURE InsertLocations (p_location_id OUT NUMBER, p_street_address IN VARCHAR2, p_postal_code IN VARCHAR2, p_city IN VARCHAR2, p_state_province IN VARCHAR2, p_country_id IN CHAR) is insert into (location_id,street_address,postal_code,city, state_province,country_id) values (p_location_id,p_street_address,p_postal_code,p_city, p_state_province,p_country_id); END InsertLocations; END CRUD_LOCATIONS; [/CODE] وفي الدرس القادم سوف أوضح كيف يتم استخدامها من خلال ال الدوت نت. 

 اسم العضو:عبدالله جابر شقليه  الاثنين,10/ذو الحجة/1426 هـ,06:53 مساءً
المثال التالي سوف أوضح استخدام الباكج ضمن الدوت نت وكيفية وصول التطبيق إلى البيانات المطلوبة في قاعدة بيانات أوراكل من خلال البروسجير (GetLocations) والتي تم تعريفها وشرحها في الدرس السابق ضمن الباكج. في هذا المثال سوف نستخدم ال Datareader من أجل جلب البيانات: [CODE] 'C# OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;"); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "CRUD_LOCATIONS.GetLocations"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("cur_Locations", OracleType.Cursor).Direction =ParameterDirection.Output; conn.Open(); OracleDataReader dr = cmd.ExecuteReader(); // output the results and close the connection. while(dr.Read()) { for(int i = 0; i < dr.FieldCount; i++) response.write(dr[i].ToString() + ";"); response.write("<br>"); } conn.Close(); 'VB.NET Dim conn As OracleConnection = New OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;") Dim cmd As OracleCommand = New OracleCommand cmd.Connection = conn cmd.CommandText = "CRUD_LOCATIONS.GetLocations" cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("cur_Locations", OracleType.Cursor).Direction = ParameterDirection.Output conn.Open Dim dr As OracleDataReader = cmd.ExecuteReader While dr.Read  Dim i As Integer = 0  While i < dr.FieldCount    response.write(dr(i).ToString + ";")    response.write("<br>")  End While  response.write("<br>") End While conn.Close [/CODE] كما تلاحظون في الكود التالي كيف تم استخدام الباكج وتحديد أي إجراء سوف نقوم بعمل العمليات عليه: [CODE]cmd.CommandText = "CRUD_LOCATIONS.GetLocations" [/CODE] حيث يتم وضع اسم الباكج ثم نقطه ثم اسم الإجراء الذي سوف نستخدمه. [CODE]cmd.Parameters.Add("cur_Locations", OracleType.Cursor).Direction = ParameterDirection.Output [/CODE] هنا سوف يتم تمرير المتغير cur_Locations الذي تم تعريفه في الباكج ضمن البروسجير GetLocations. بالنسبة لباقي الإجرائات لكيفية العمل عليها نفس ما قمت شرح من قبل لكيفية حذف السجلات يتم استخدام نفس الطريقة لعملية ترمير المتغيرات مع الأخد بعين الاعتبار بأن كل بروسجير أو فانكشن ضمن package Header يتم الوصول له من خلال تعريف اسم الباكج أولا ومن ثم اسم ال Procedure أو ال Function المراد استخدامه كما تم توضحيه أعلاه في المثال السابق. ملاحظة: الميزة هنا أنك تتعامل مع ال Procedure أو ال Function كأنك تتعامل مع object من class. 

 اسم العضو:عبدالله جابر شقليه  الخميس,13/ذو الحجة/1426 هـ,10:18 صباحاً
[COLOR=blue]Stored Procedures That Return a Single Value[/COLOR] ال [COLOR=blue]ExecuteOracleScalar() method [/COLOR]من [COLOR=blue]OracleCommand class [/COLOR]تستخدم لتنفيذ جمل ال [COLOR=blue]SQL [/COLOR]و [COLOR=blue]Stored procedure [/COLOR]التي تقوم باسترجاع قيمه واحد كا [COLOR=blue]OracleType data type.[/COLOR] اذا كان الأمر قام بعملية استرجاع نتائج فأن [COLOR=blue]ExecuteOracleScalar() method [/COLOR]سوف تسترجع قيمة أول حقل من الصف الأول. إن ال [COLOR=blue]ExecuteOracleScalar() method [/COLOR]تسترجع قيمة فارغة في حالة إذا كانت [COLOR=blue]REF CURSOR [/COLOR]سوف تسترجع قيمة أول حقل لأول صف عندما تشير أليها [COLOR=blue]REF CURSOR.[/COLOR] ال [COLOR=blue]ExecuteOracleScalar() method [/COLOR]من [COLOR=blue]OracleCommand class [/COLOR]هي شبيهة لل [COLOR=blue]ExecuteOracleScalar() method [/COLOR]لكناه تسترجع البيانات كأ .[COLOR=blue]NET Framework data type.[/COLOR] رغم كل ما تم ذكره في الأعلى فأنه ولا واحده من هذ [COLOR=blue]methods [/COLOR]مفيدة للتعامل مع [COLOR=blue]Stored procedure.[/COLOR] ال [COLOR=blue]Oracle stored procedures [/COLOR]لا مكنها استراج القيمة كأجزاء مرجهة من الجمل، فقط عن طريق متغيرات خارجية يتم عمل ذلك، وأيضا لا تستطيع من اسرتجاع مجموعة من النتائج اله باستثناء المتغيرات الخارجية لل [COLOR=blue]REF CURSOR .[/COLOR] أنستطيع من استرجاع القيم فقط عن باستخدام [COLOR=blue]Oracle function [/COLOR]عن طريق [COLOR=blue]RETURN parameter [/COLOR]وليس باستخدام أحد [COLOR=blue]ExecuteScalar methods.[/COLOR] 

 اسم العضو:عبدالله جابر شقليه  الخميس,13/ذو الحجة/1426 هـ,10:36 صباحاً
Sequences ال Sequences تستخدم في الأوراكل لتوليد رقم unique بدلاً من data type uniqueidentifier المستخدمة في SQL server. الهدف من استخدام Sequences التي تقوم بتوليد رقم unique من أجل استخدامه كمفتاح أساسي (PK) للجدول، وهي تستخدم من أجول توليد أرقام (Auto number). الأن في المثال التالي سوف نقوم بعملية كيف يتم انشاء Sequences في الأوراكل [CODE language="sql"]create SEQUENCE LOCATIONS_SEQ INCREMENT BY 100 START WITH 1 MAXVALUE 9900 MINVALUE 1 NOCYCLE NOCACHE NOORDER[/CODE] في المثال التالي سوف نعرف كيف يتم استدعاء SEQUENCE التي قمنا بإنشاءها أعلى : [CODE language="sql"]create OR REPLACE PROCEDURE ADD_LOCATION ( p_location_id OUT NUMBER, p_street_address IN VARCHAR2, p_postal_code IN VARCHAR2, p_city IN VARCHAR2, p_state_province IN VARCHAR2, p_country_id IN CHAR ) AS BEGIN insert INTO LOCATIONS ( LOCATION_ID, STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) VALUES ( LOCATIONS_SEQ.NEXTVAL, p_street_address, p_postal_code, p_city, p_state_province, p_country_id ; select LOCATIONS_SEQ.CURRVAL INTO p_location_id FROM DUAL; END ADD_LOCATION;[/CODE] تشاهدون أنه وضعنا القيمة LOCATIONS_SEQ.NEXTVAL للحقل LOCATION_ID في جملة الإضافة التي تم وضعها داخل ال Stored procedure، فهكذا يتم استخدام ال Sequences حيث نقوم بوضع اسم ال Sequence مع وضع نقطه ثم NEXTVAL. [CODE language="sql"]select LOCATIONS_SEQ.CURRVAL INTO p_location_id FROM DUAL;[/CODE] هنا تم عمل جملة استعلام لل Sequence من الجدول DUAL بحيث سوف تحضر لنا القيمة الحالية التي تم تولديها لل LOCATIONS_SEQ ويتم تخزينها داخل المتغير p_location_id. الأن سوف أضع لكم الكود الدوت نت من أجل عملية استدعاء البروسجير لكيفية الإضافة واسترجاع قيمة ال LOCATIONS_SEQ الحالية: [CODE language="CS"] 'C# OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;"); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "ADD_LOCATION"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("p_location_id", OracleType.Number).Direction = ParameterDirection.Output; cmd.Parameters.Add("p_street_address", OracleType.VarChar).Value = "123 Any Street"; cmd.Parameters.Add("p_postal_code", OracleType.VarChar).Value = "33040"; cmd.Parameters.Add("p_city", OracleType.VarChar).Value = "Key West"; cmd.Parameters.Add("p_state_province", OracleType.VarChar).Value = "FL"; cmd.Parameters.Add("p_country_id", OracleType.VarChar).Value = "US"; OracleString rowId; conn.Open(); int rowsAffected = cmd.ExecuteOracleNonQuery(out rowId); conn.Close(); response.write("Rows affected: " + rowsAffected); response.write("Location ID: " +cmd.Parameters["p_location_id"].Value); [/CODE] [CODE language="vb"] 'VB.NET Dim conn As OracleConnection = New OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;") Dim cmd As OracleCommand = New OracleCommand cmd.Connection = conn cmd.CommandText = "ADD_LOCATION" cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("p_location_id", OracleType.Number).Direction = ParameterDirection.Output cmd.Parameters.Add("p_street_address", OracleType.VarChar).Value = "123 Any Street" cmd.Parameters.Add("p_postal_code", OracleType.VarChar).Value = "33040" cmd.Parameters.Add("p_city", OracleType.VarChar).Value = "Key West" cmd.Parameters.Add("p_state_province", OracleType.VarChar).Value = "FL" cmd.Parameters.Add("p_country_id", OracleType.VarChar).Value = "US" Dim rowId As OracleString conn.Open Dim rowsAffected As Integer = cmd.ExecuteOracleNonQuery(rowId) conn.Close response.write("Rows affected: " + rowsAffected) response.write("Location ID: " + cmd.Parameters("p_location_id").Value) [/CODE] 

 اسم العضو:عبدالله جابر شقليه  الخميس,13/ذو الحجة/1426 هـ,10:42 صباحاً
الأن سوف أضع لكم مثال لكيفية تخزين السجلات المرجعة من REF CURSOR داخل ال Dataset. سوف نعمل على نفس المثال الذي استخدمانها بتخزين السجلات داخل ال Datareader على الرابط التالي: [URL=http://www.arabmoheet.net/forum/default.asp?codepage=3&topic_no=5130&page=1&#entry20047]http://www.arabmoheet.net/forum/default.asp?codepage=3&topic_no=5130&page=1&#entry20047[/URL] [CODE] 'C# OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;"); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "CRUD_LOCATIONS.GetLocations"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("cur_Locations", OracleType.Cursor).Direction =ParameterDirection.Output; OracleDataAdapter da = new OracleDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); 'VB.NET Dim conn As OracleConnection = New OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;") Dim cmd As OracleCommand = New OracleCommand cmd.Connection = conn cmd.CommandText = "CRUD_LOCATIONS.GetLocations" cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("cur_Locations", OracleType.Cursor).Direction = ParameterDirection.Output Dim da As OracleDataAdapter = New OracleDataAdapter(cmd) Dim ds As DataSet = New DataSet da.Fill(ds) [/CODE]  

 اسم العضو:عبدالله جابر شقليه  الخميس,13/ذو الحجة/1426 هـ,10:50 صباحاً
في الدرس التالي سوف نشاهد كيف يمكننا من استرجاع أكثر من نتيجة وتخزينها داخل ال Dataset: [CODE language="sql"] CREATE OR REPLACE PACKAGE SELECT_EMPLOYEES_JOBS AS TYPE T_CURSOR IS REF CURSOR; PROCEDURE GetEmployeesAndJobs ( cur_Employees OUT T_CURSOR, cur_Jobs OUT T_CURSOR ); END SELECT_EMPLOYEES_JOBS; [/CODE] كما تشاهدون بأنه تم تعريف لل PROCEDURE GetEmployeesAndJobs متغيرين من نوع REF CURSOR، حيث لكل جملة استعلام يتم تعريف لها REF CURSOR. الكود التالي من أجل تعريف محتوى PACKAGE SELECT_EMPLOYEES_JOBS [CODE language="sql"] CREATE OR REPLACE PACKAGE BODY SELECT_EMPLOYEES_JOBS AS PROCEDURE GetEmployeesAndJobs ( cur_Employees OUT T_CURSOR, cur_Jobs OUT T_CURSOR ) IS BEGIN -- return all EMPLOYEES records OPEN cur_Employees FOR SELECT * FROM Employees; -- return all JOBS records OPEN cur_Jobs FOR SELECT * FROM Jobs; END GetEmployeesAndJobs; END SELECT_EMPLOYEES_JOBS; [/CODE] والأن كود الدت نت من أجل استرجاع أكثر من مجموعة من النتائج وتخزينها داخل ال Dataset، وكيفية إنشاء علاقة بينهم: [CODE] 'C# OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;"); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT_EMPLOYEES_JOBS.GetEmployeesAndJobs"; cmd.Parameters.Add("cur_Employees", OracleType.Cursor).Direction = ParameterDirection.Output; cmd.Parameters.Add("cur_Jobs", OracleType.Cursor).Direction = ParameterDirection.Output; cmd.CommandType = CommandType.StoredProcedure; OracleDataAdapter da = new OracleDataAdapter(cmd); da.TableMappings.Add("Table", "EMPLOYEES"); da.TableMappings.Add("Table1", "JOBS"); DataSet ds = new DataSet(); da.Fill(ds); ds.Relations.Add("EMPLOYEES_JOBS_RELATION", ds.Tables["JOBS"].Columns["JOB_ID"], ds.Tables["EMPLOYEES"].Columns["JOB_ID"]); response.write("Employee ID: " + ds.Tables["EMPLOYEES"].Rows[1]["EMPLOYEE_ID"] + "; Job Title: " + ds.Tables["EMPLOYEES"].Rows[1].GetParentRow( "EMPLOYEES_JOBS_RELATION")["JOB_TITLE"]); 'VB.NET Dim conn As OracleConnection = New OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;") Dim cmd As OracleCommand = New OracleCommand cmd.Connection = conn cmd.CommandText = "SELECT_EMPLOYEES_JOBS.GetEmployeesAndJobs" cmd.Parameters.Add("cur_Employees", OracleType.Cursor).Direction = ParameterDirection.Output cmd.Parameters.Add("cur_Jobs", OracleType.Cursor).Direction = ParameterDirection.Output cmd.CommandType = CommandType.StoredProcedure Dim da As OracleDataAdapter = New OracleDataAdapter(cmd) da.TableMappings.Add("Table", "EMPLOYEES") da.TableMappings.Add("Table1", "JOBS") Dim ds As DataSet = New DataSet da.Fill(ds) ds.Relations.Add("EMPLOYEES_JOBS_RELATION", ds.Tables("JOBS").Columns("JOB_ID"), ds.Tables("EMPLOYEES").Columns("JOB_ID")) response.write("Employee ID: " + ds.Tables("EMPLOYEES").Rows(1)("EMPLOYEE_ID") + "; Job Title: " + ds.Tables("EMPLOYEES").Rows(1).GetParentRow("EMPLOYEES_JOBS_RELATION")("JOB_TITLE")) [/CODE] في الدرس القادم إن شاءالله سوف أشرح لكم كيف يتم تعديل البيانات لل Dataset من خلال DataAdapter مع الأوراكل.  

جميع الحقوق محفوظة لـمنتديات المحيط العربي 2004 - 2021