مشاهدة النسخة كاملة : كيفية ربط الأوراكل مع asp.net,شرح لكيفية ربط procedure وال function


محمد منصور فرايتر
07-11-2007, 05:40 AM
شرح الأخ : عبدالله جابر شقليه

السلام عليكم ورحمة الله وبركاته
سوف أقوم بوضع لكم دروس لكيفية ربط الأوراكل مع ال asp.net لكيفية التعامل مع procedure و function الأوراكل.
لعملية ربط الأوراكل مع ال asp.net سوف نقوم باستخدما namespace(System.Data.OracleClient) والتي تتعامل مع اصدار أوراكل 9i وما فوق.
وهنا سوف أضع لكم الكلاسس التي سوف نتعامل بها من خلال System.Data.OracleClient.
1-OracleCommand:هي مجموعة من جمل ال sql من stored procedure يتم تنفيذها على قاعدة بيانات الأوراكل.
2-OracleConnection:تستخدم لفتح الاتصال مع قاعدة بيانات الأوراكل وغلقها.
3-OracleParameter:وهي المتغيرات التي يتم إسنادها إلى OracleCommand من أجل وضع القيم للحقول.
4-OracleParameterCollection: تحتوي على مجموعة من المتغيرات.
5-OracleType: يتم من خلالها تحديد نوع حقول المتغيرات المسندة إلى OracleCommand وتركيبها.
عندما تود الاتصال بقاعدة بيانات الأوراكل يجب أن يتم إضافة ملف ال DLL إلى المشروع وهو System.Data.OracleClient.dll ، ويتم إضافته كما هو موضع في الصور التالية:
1- اذهب إلى Solution Exploer
ثم قوم بالضغط بالزر الأيمن على المشورع وقوم باختيار Add reference كما في الصورة التالية:

http://www.arabmoheet.net/forum/Members_Upload_Pics/1/add%20reference%20System.Data.OracleClient.JPG

2- سوف تظهر لك نافذة جديدة ، اذهب إلى tab وقوم باختيار .NET واختار منها System.Data.OracleClient، كما في الصورة التالية:


http://www.arabmoheet.net/forum/Members_Upload_Pics/1/System.Data.OracleClient.JPG
الآن لاستخدام ال name space (System.Data.OracleClient) ضمن مشروعك قوم بعمل imports System.Data.OracleClient كالتالي:


using System.Data.OracleClient;'C#



Imports System.Data.OracleClient 'VB.NET

محمد منصور فرايتر
07-11-2007, 05:40 AM
قوم بإضافة الاتصال بقاعدة البيانات كالتالي:



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


في المشاركة التالية سوف أقوم بشرح كيف يتم عمل عمليات على ال Oracle باستخدام ال procedure وال function.

الآن سوف أقوم بوضع مثال من أجل كيفية إرجال البيانات من Stored procedure.
قوم بإنشاء ال procedure التاالية من أجل إرجاع مجموع السجلات:


CREATE OR REPLACE PROCEDURE count_arabmoheet_members
(
reccount OUT NUMBER
)
IS
BEGIN
SELECT COUNT(*) INTO reccount
FROM members;
END count_arabmoheet_members;


لكيفية إسترجاع مجموع السجلات المرجعة من ال Stored procedure.
1- قوم بإنشاء الكائن OracleCommand، حيث يتم وضع به خاصية ال Connection وال CommandText لإسناد لها اسم ال Stored procedure و والخاصية CommandType.StoredProcedure، كالتالي:


'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


- سوف نقوم بإنشاء الكائن OracleParameter والذي يستخدم من أجل إدخال القيم واستخراجها إلى Stored procedure، كالتالي:

'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




كما تشاهدون أنه تم وضع متغير reccount وهو المتغير الذي تم تعريفه في Stored procedure(count_arabmoheet_members) والذي يحمل مجموع السجلات المرجعة من عملية الاستعلام، وتم وضعه له ال direction قيمته ParameterDirection.Output أي أن عباره عن متغير يحتوي على نتائج مرجعه من ال Stored procedure.
ومن أجل الحصول على المستخرجات يمكنكم بناء DataSet, DataTable, or DataReader ولكن في مثالنا هذا لن نحتاج لاستخدامهم لأنه فقط قيمة واحده التي سوف تعود لنا وهي عدد السجلات فلذلك سوف نستخدم فقط الأمر ExecuteNonQuery، كالتالي:



'C#
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
'VB.NET
conn.Open
cmd.ExecuteNonQuery
conn.Close


من أجل طباعة عدد السجلات كالتالي:


'C#
response.write (cmd.Parameters["reccount"].Value);
'VB.NET
response.write(cmd.Parameters("reccount").Value)


في الدرس التالي سوف أقوم بوضع ما هي ال Methods المستخدمه لاستخراج البيانات في الكلاسس OracleCommand.

محمد منصور فرايتر
07-11-2007, 05:41 AM
سوف أقوم الآن بسرد لكم ال Methods المستخدمه لإسترجاع الباينات من الكلاسس OracleCommand:
1-ExecuteReader:تستخدم لبناء OracleDataReader عن طريق تنفيذ ال Stored procedure لاسترجاع مجموعه من البيانات.
2-ExecuteNonQuery:تستخدم لتنفيذ الاستعلام وال procedure التي لا تسترجع مجموعة من السجلات فقط التي تسترجع عدد السجلات التي تم التأثير عليها.
3-ExecuteOracleNonQuery:تستخدم لتنفيذ الاستعلام لاسترجاع عدد السجلات التي تم التأثير عليها، وهذه ال method تستخدم أيضاً OracleString parameter من أجل استرجاع قيمة ID لآخر سجل تم التعديل عليها عن طريق (UPDATE, INSERT, or DELETE ).
4-ExecuteScalar:تستخدم لاسترجاع قيمة أول حقل من أول سجل من مجموعى النتائج وتكون البيانات من نوع (NET Framework).
5-ExecuteOracleScalar: تستخدم مثل ExecuteScalar لكن يكون نوع البيانات على هيئة OracleType التي يتم تحديها.

ملاحظة: المنهج ExecuteOracleNonQuery() من الكلاس OracleCommand المستخدمة لتنفيذ جمل الاستعلام وال Stored procedure التي لا تقوم باسترجاع أي سجل، هذا المنهج يوقم باسترجاع قيمة من نوع int متمثلة من خلال عدد السجلات التي تم التأثير عليها من خلال الأوامر (UPDATE, INSERT, and DELETE) غير ذلك تقوم باسترجاع -1،اذا قمت بتنفيذ جمله استعلام سواء " ادخال, حذف,تعديل" وهذه الجمله قامت بالتعديل على او اضافه سجل " واحد " فقط , فان هذه الMethod تسترجع لك جمله OracleString لها رقم Uniquely "مميز" تستطيع من خلال الرقم هذا ان تستطيع التعرف على هذا السجل وتتمكن من معرف التغيير الذى احدثه فى قاعدة البيانات،يمكنك استخدام هذه القيمه لتحسين اداء الsubsequent المتعلقه بتلك الqueries
أيضا يمكنكم استخدام المنهج ExecuteNonQuery() والتي تعمل مثل ExecuteOracleNonQuery() لكنها لا تقوم باسترجاع (unique row identifier) كما سبق وذكرته لكم في الأعلى.

محمد منصور فرايتر
07-11-2007, 05:41 AM
المثال التالي سوف نقوم بعمل Stored procedure من أجل حذف بعض السجلات من جدول ال Topci عن طريق اسناد قيمة واحده لـ procedure، والتي لن تسترجع أي بيانات:


CREATE OR REPLACE PROCEDURE delete_topic
(
T_no NUMBER
)
IS
BEGIN
DELETE FROM topic
WHERE topic_no = T_no;
END delete_topic;


وهذا الكود التالي من أجل تنفيذ ال
Stored procedure في الدوت نت:


'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)


عندما نود أن نقوم باسرجاع قيمة واحد من لقيمة حقل من خلال الاستعلام يجب أن نستخدم لذلك ال Function وليس ال Stored procedure لأنها لا تقوم باسترجاع القيم كما التي يتم استخدامها في T-SQL.
المثال التالي سوف نقوم بإنشاء Function من أجل إرجاع قيمة واحده فقط كالتالي:


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;


ولتنفيذ ال Function في الدوت نت يتم تنفيذها مثل عند استخدام ال Stored procedure، ونستخدم معها ParameterDirection.ReturnValue من أجل عملية استرجاع البيانات من خلال ال Function، وشاهدو الكود التالي للقيام بذلك:


'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)


وفي الدروس القادمة سوف أقوم بشرح كيف ستم استرجاع مجموعة من السجلات وذلك عن طريق استخدام REF CURSORS ضمن ال Packages.

محمد منصور فرايتر
07-11-2007, 05:42 AM
Result Sets and REF CURSORS
تستخدم ال REF CURSOR data type للعمل مع مجموعة نتائج ال Oracle.
ال REF CURSOR عباره عن مؤشر من خلال استرجاع السجلات في بيئة PL/SQL query، وهي ليست كأي مؤشر عادي، حيث أنها تعتبر كمتغير، وهو مرجع للمؤشر الذي تستطيع من خلاله الربط مع نتائج سجلات مختلفة خلال عملية التنفيذ.
استخدام REF CURSOR كمتغير خارجي لتمرير قيم السجلات من بنية Oracle إلى البرنامج التطبيقي المستخدم.
يتم تعريف المتغير الخارجي من خلال OracleType.Cursor في عملية الاستدعاء من خلال البرنامج التطبيقي للوصول إلى سجلات النتائج المؤشر عليها من خلال REF CURSOR.
ال OracleConnection يجب يجب أن تبقى مفتوحة خلال استخدام ال REF CURSOR.

Packages
ال Packages هي عبارة عن تعريف مسبق لمجموعة من ال procedures و ال Funcation التي تستطيع استخدامها فيما بعد في برنامجك التطبيقي.
المفهوم العام باستخدامه من خلال إنشاء أوامر ال PL/SQL والتي تستطيع بناء ال Packages ومحتوياته من ال procedures و ال Funcation واستخدامها لاحقاً في برنامجك من خلال الاستدعاء لاسم Package ومن ثم التحديد على أي ل procedures أو ال Funcation المراد الوصول لها.
قد لا تجد مكافئ لي ال Packages في أي برنامج قواعد بيانات آخر حيث أنك لن تجدها من خلال استخدام T-SQL.

ال Packages بها جزئين مهمين:
1- Specification (or spec): وهي عبارة عن مجمع لي تعريف مجموعة من ال procedures و ال Funcation، وفي منطقة ال Header يتم تعريف مجموعة من المتغيرات التي سيتم استخدامها خلال كتابة ال procedures و ال Funcation، ولكي تكون الأمور أكثر وضوحا نستطيع أن نشبه ال Package بأي class مشابهة في لغة ال C و C++.
2- Body:هو الذي يحتوي على ال procedures و ال Funcation التي سنقوم بكتابتها والمعرفة سابقا في ال Header.

والأن سنقوم بتوضيح أنوع المتغيرات االتي سوف تستخدم من خلال كتابة ال procedures أو ال Funcation، وهم ثلاث أنواع كالتالي:
1-IN:وهوي عباره عن متغيرات يتم إدخالها من خلال البرنامج التطبيقي إلى ال procedures أو ال Funcation من خلال استخدام لغة ال PL/SQL(كطريقة تمرير قيمة إلى متغير داخل ل procedures أو ال Funcation لاستدعائه).
2- OUT:هي القيمة التي يتم تصديرها من خلال ال procedures أو ال Funcation إلى البرنامج التطبيقي.
3- INOUT:هي المتغير الذي يتم تمرير إمن خلال البرنامج التطبيقي لى ال procedures أو ال Funcation ومن ثم يتم التعديل عليها داخل Packages وإرجاع القيمة مرة آخرى إلى البرنامج التطبيقي.

وفي الدرس القادم سوف أتطرق لوضع أمثلة حول ما تم توضيحية أعلاه.

محمد منصور فرايتر
07-11-2007, 05:42 AM
في المثال التالي سوف أقوم بوضع لكيفية استخدام ال package لكيفية تعريف بها مجموعة من ال Stored procedure وال Function:


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;


وهذا ما يتم تعريفه داخل ال package Header.

والمثال التالي يوضح ألية استخدام التعريفات داخل ال Header وبرمجتها داخل ال Body:


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_ci ty,
p_state_province,p_country_id);

END InsertLocations;

END CRUD_LOCATIONS;


وفي الدرس القادم سوف أوضح كيف يتم استخدامها من خلال ال الدوت نت.

محمد منصور فرايتر
07-11-2007, 05:42 AM
المثال التالي سوف أوضح استخدام الباكج ضمن الدوت نت وكيفية وصول التطبيق إلى البيانات المطلوبة في قاعدة بيانات أوراكل من خلال البروسجير (GetLocations) والتي تم تعريفها وشرحها في الدرس السابق ضمن الباكج.

في هذا المثال سوف نستخدم ال Datareader من أجل جلب البيانات:



'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



كما تلاحظون في الكود التالي كيف تم استخدام الباكج وتحديد أي إجراء سوف نقوم بعمل العمليات عليه:

cmd.CommandText = "CRUD_LOCATIONS.GetLocations"

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

cmd.Parameters.Add("cur_Locations", OracleType.Cursor).Direction = ParameterDirection.Output
هنا سوف يتم تمرير المتغير cur_Locations الذي تم تعريفه في الباكج ضمن البروسجير GetLocations.

بالنسبة لباقي الإجرائات لكيفية العمل عليها نفس ما قمت شرح من قبل لكيفية حذف السجلات يتم استخدام نفس الطريقة لعملية ترمير المتغيرات مع الأخد بعين الاعتبار بأن كل بروسجير أو فانكشن ضمن package Header يتم الوصول له من خلال تعريف اسم الباكج أولا ومن ثم اسم ال Procedure أو ال Function المراد استخدامه كما تم توضحيه أعلاه في المثال السابق.
ملاحظة: الميزة هنا أنك تتعامل مع ال Procedure أو ال Function كأنك تتعامل مع object من class.

محمد منصور فرايتر
07-11-2007, 05:43 AM
Stored Procedures That Return a Single Value

ال ExecuteOracleScalar() method من OracleCommand class تستخدم لتنفيذ جمل ال SQL و Stored procedure التي تقوم باسترجاع قيمه واحد كا OracleType data type.
اذا كان الأمر قام بعملية استرجاع نتائج فأن ExecuteOracleScalar() method سوف تسترجع قيمة أول حقل من الصف الأول.
إن ال ExecuteOracleScalar() method تسترجع قيمة فارغة في حالة إذا كانت REF CURSOR سوف تسترجع قيمة أول حقل لأول صف عندما تشير أليها REF CURSOR.

ال ExecuteOracleScalar() method من OracleCommand class هي شبيهة لل ExecuteOracleScalar() method لكناه تسترجع البيانات كأ .NET Framework data type.
رغم كل ما تم ذكره في الأعلى فأنه ولا واحده من هذ methods مفيدة للتعامل مع Stored procedure.
ال Oracle stored procedures لا مكنها استراج القيمة كأجزاء مرجهة من الجمل، فقط عن طريق متغيرات خارجية يتم عمل ذلك، وأيضا لا تستطيع من اسرتجاع مجموعة من النتائج اله باستثناء المتغيرات الخارجية لل REF CURSOR .

أنستطيع من استرجاع القيم فقط عن باستخدام Oracle function عن طريق RETURN parameter وليس باستخدام أحد ExecuteScalar methods.

محمد منصور فرايتر
07-11-2007, 05:45 AM
Sequences
ال Sequences تستخدم في الأوراكل لتوليد رقم unique بدلاً من data type uniqueidentifier المستخدمة في SQL server.
الهدف من استخدام Sequences التي تقوم بتوليد رقم unique من أجل استخدامه كمفتاح أساسي (PK) للجدول، وهي تستخدم من أجول توليد أرقام (Auto number).

الأن في المثال التالي سوف نقوم بعملية كيف يتم انشاء Sequences في الأوراكل


CREATE SEQUENCE LOCATIONS_SEQ



INCREMENT BY 100
START WITH 1
MAXVALUE 9900
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER




في المثال التالي سوف نعرف كيف يتم استدعاء SEQUENCE التي قمنا بإنشاءها أعلى :



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
http://www.arabmoheet.net/forum/editor/smiles/wink2.gif;

SELECT LOCATIONS_SEQ.CURRVAL INTO p_location_id FROM DUAL;
END ADD_LOCATION;


تشاهدون أنه وضعنا القيمة LOCATIONS_SEQ.NEXTVAL للحقل LOCATION_ID في جملة الإضافة التي تم وضعها داخل ال Stored procedure، فهكذا يتم استخدام ال Sequences حيث نقوم بوضع اسم ال Sequence مع وضع نقطه ثم NEXTVAL.

SELECT LOCATIONS_SEQ.CURRVAL INTO p_location_id FROM DUAL;

هنا تم عمل جملة استعلام لل Sequence من الجدول DUAL بحيث سوف تحضر لنا القيمة الحالية التي تم تولديها لل LOCATIONS_SEQ ويتم تخزينها داخل المتغير p_location_id.

الأن سوف أضع لكم الكود الدوت نت من أجل عملية استدعاء البروسجير لكيفية الإضافة واسترجاع قيمة ال LOCATIONS_SEQ الحالية:



'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);

'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)

محمد منصور فرايتر
07-11-2007, 05:45 AM
الأن سوف أضع لكم مثال لكيفية تخزين السجلات المرجعة من REF CURSOR داخل ال Dataset.
سوف نعمل على نفس المثال الذي استخدمانها بتخزين السجلات داخل ال Datareader على الرابط التالي:
http://www.arabti.com/vb/showpost.php?p=31645&postcount=6



'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)

محمد منصور فرايتر
07-11-2007, 05:45 AM
في الدرس التالي سوف نشاهد كيف يمكننا من استرجاع أكثر من نتيجة وتخزينها داخل ال Dataset:



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;



كما تشاهدون بأنه تم تعريف لل PROCEDURE GetEmployeesAndJobs متغيرين من نوع REF CURSOR، حيث لكل جملة استعلام يتم تعريف لها REF CURSOR.
الكود التالي من أجل تعريف محتوى PACKAGE SELECT_EMPLOYEES_JOBS



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;



والأن كود الدت نت من أجل استرجاع أكثر من مجموعة من النتائج وتخزينها داخل ال Dataset، وكيفية إنشاء علاقة بينهم:



'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"))

RDWAN1212
03-10-2008, 05:18 PM
جزاك الله عنا كل خير

mysara
04-12-2008, 03:17 PM
Hi My Dear Thanks For All Messages

مبرمج اليمن
09-04-2008, 10:18 PM
تمام التمام....