الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال حول Execute وبين Open

بدأه MS_SQL في 18 مارس 2008 · 2 رد · 618 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

أخواني اريد أن أعرف الفرق بين هذين الكودين

sql = "select * from table"
rs.open sql, cnn

وبين

cnn.Execute = "select * from table"

تم تعديل هذه المشاركة بواسطة medo_Programming في 18 مارس 2008 في 09:03

فلسطين .. سوريا ..بورما ......وماذا بعد ؟!

سابقا

medo_programming

موقعي : www.alkhayat-it.com

مواضيع مهمه

-----------------------------------------------:

تعلم كل شىء عن الTriggers

#2

أولاً Execute غرض أو Function يجب كتابتة كما يلي :

Cn.Execute "Select * From Table"

ثانياً جمل إستعلام التحديد Select يجب أن يتم إرتجاعها بكائن Rs حتي نتمكن من الإستفادة منه كما يلي :

Set Rs = Cn.Execute("Select * From Table")

أما عن الفرق فجملة Execute وظيفتها الرئيسية هي تنفيذ العديد من المهام دون إرتجاع أي قيمة مثل إدراج جدول أو عارض أو فهرس أو قيد مثل العلاقات ، أو إدراج سجلات أو تعديل سجلات أو حذف سجلات أو ..... الي آخرة ، بإختصار شديد التمكين من إجراء جمل DDL و DML كاملة !!!

حقيقتاً يجوز إجراء DDL و DML من كائن الـ Recordset ، حيث أن هذا الكائن من الطبيعي يتعامل مع الـ Execute لتنفيذ المهام ، ولكن من المستحب إستخدام كل شيء في مكانة الصحيح ، ولكن كل شيء يجوز طالما لم تحاول إستخدام عملية الإرتجاع علي كائنات الفيجوال بيزيك مثل الجريد وغيرة .

لكن جملة Select هي الوحيدة التي تختلف بعض الشيء ، فالغرض Execute لا يرتجع مجموعة السجلات إلا بعد تحميلة علي كائن الـ Recordset ، ولهذا يستحب دائماً إستخدام جملة Open من خلال كائن الـ Recordset مباشرتاً !!!

ولكن أخي لما وجود هذه الإمكانياتين :

Rs.Open "SQL"
Set Rs = Cn.Execute("SQL")

هناك في بعض الأحيان أمور تتطلب منا إستخدام كائن Execute ، علي سبيل المثال في قاعدة بيانات أوراكل ننشأ إجراء Procedure يرتجع مجموعة من السجلات كما يلي :

Create Or Replace Package PKG
As
   Type Cur_Emp Is Ref Cursor;
   Procedure List_Emp(ID_Start  Number,ID_End Number, O_Emp Out Cur_Emp);
End;
/

Create Or Replace Package Body PKG
As
   Procedure List_Emp(ID_Start  Number,ID_End Number, O_Emp Out 
									   Cur_Emp)
   As
   Begin
	   Open O_Emp For Select * From Emp Where Emp_ID Between ID_Start 
									   And ID_End;
   End;
End;
/

مع إحترامي للجميع هذا ليس مكان أوراكل ولكنني لم أشرح هذا الجزء ... ولكن من الواضح أن هناك حزمة مثل الـ Class تقريباً موجودة بداخل قاعدة البيانات تحتوي علي إجراء List_Emp ويستقبل ثلاثة باراميترات ، الأول والثاني مدخلات ، أما الثالث مخرج مجموعة من السجلات !!!!!!!!!

في هذه الحالة يتم إستخدام كائن الـ Command حيث أنه يحتوي علي جملة Execute بنفس الإمكانية ، ولكن سبب لجوئنا الي هذا الكائن لأننا سنتعامل مع الباراميترات وفي نفس الوقت سنرتجع قيم الجدول المرتجع بالباراميتر الثالث وذلك بداخل كائن الـ Recordset ، أنظر :

Dim Cmd As New ADODB.Command
Set Cmd.ActiveConnection = Cn
Cmd.CommandText = "{Call PKG.List_Emp(?,?,:)}"
Cmd.Parameters(0).Value = 2
Cmd.Parameters(1).Value = 4
Set Rs = Cmd.Execute
While Not Rs.EOF
	MsgBox Rs!Emp_Name
	Rs.MoveNext
Wend

في هذه الحالة إضطررنا لإستخدام كائنين ، الأول هو Command لإستخدام كلاً من parameters و Execute ، أما الثاني فهو الكائن Recordset لإرتجاع مجموعة السجلات !!!!

لكن أخي معلومة تهد كل ما قلتة سابقاً ، هل يا تري لو إستخدمنا كائن الـ Recordset مباشرتاً هل يجوز أم لا !!!!

في الحقيقة يجوز والدليل هو الكود التالي :

If (Rs.State = 1) Then Rs.Close
Rs.Open "{Call PKG.List_Emp(2,4,:)}", Cn
While Not Rs.EOF
	MsgBox Rs!Emp_Name
	Rs.MoveNext
Wend

لا حول ولا قوة إلا بالله ، طب لما كل هذه اللخبطة !!!

الأخ الغالي ، لو دققت في كلامي في البداية أنني ذكرت لك أن كائن الـ Command هو كائن تنفيذ جمل الـ SQL ، وأن جملة Execute والله أعلم هو مجرد جملة تستدعي الكلاس المدعي Command ، وأن جملة Open تستدعي أيضاً الكلاس المدعي Command !!

معني هذا أن الكل حلقة وصل للمكتبة الرئيسية التي تدعي ADODB ، وإذا أنت فكرت في إنشاء مكتبة جديدة من الطبيعي أن تفعل حلقة وصل بين المكتبات بحيث أن يكون كل إجراء وكل غرض وكل خاصية وكل وظيفة لها إستخدامها الخاص ولكن الكل ينظر في إتجاة واحد !!!

الله أعلم ، لكن أخي هذه هي سياسة البرمجة الكائنية ... بإختصار شديد وبوجة عام الغرض Execute هو المسئول عن تنفيذ جمل الـ SQL التي لا تتطلب بإرتجاع سجلات مثل Insert,Update,Delete,Create , Alter,Drop ، أما بخصوص جملة Select فمن المفضل إستخدام الجملة المناسبة لها وهي Open المسئول الوحيد في كائن Recordset لإرتجاع قيمة مباشرتاً دون أي قلق ، أما إذا كنت ترغب في إستخدام جملة Execute فيمكنك ذلك ولكن بشروط خاصة .

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

في هذه الحالة لا يجوز إستخدام جملة Open بل يجب علينا إستخدام جملة Execute نظراً لأننا ندخل ونخرج قيم وليس سجلات ، انظر الي المثال التالي :

Create procedure Calc(N1 Number,N2 Number,C Out Number)
As
Begin
  C := N1 + N2;
End;
/

الآن يمكننا إستخدام Execute كما يلي :

Set Cmd.ActiveConnection = Cn
Cmd.CommandText = "{Call Calc(?,?,?)}"
Cmd.Parameters(0).Value = 2
Cmd.Parameters(1).Value = 4
Set Rs = Cmd.Execute
Me.Caption = Cmd.Parameters(2).Value

لكن إذا فكرت في إستخدامة كما يلي سيرتجع لك خطأ :

If (Rs.State = 1) Then Rs.Close
Rs.Open "{Call Calc(2,4,?)}", Cn

أخي الفاضل ، دعني أكرر وبوجة عام ، جملة Execute تستخدم لتنفيذ جمل SQL التي لا ترتجع من خلالها سجلات ، أما Open فتستخدم في إرتجاع سجلات

شكراً

تم تعديل هذه المشاركة بواسطة MMA_EG_Cairo في 18 مارس 2008 في 10:30

لا تخلط ما بين شخصيتي وأسلوبي .. فشخصيتي هي

ما أنا عليه وتحت تصرفي .. وأسلـوبي يعتمد عليـك

أنت وتصرفاتك

ولحظاتي صمت... وصمـت لحظاتي كلام ... كلامه

اشد آلام ... فصمتي أنا عنوان

عصر التكنولوجيا المعلوماتية(مدونتي الخاصة)

My FaceBook

#3

أخي مشكور وجزاك الله خيرا

فلسطين .. سوريا ..بورما ......وماذا بعد ؟!

سابقا

medo_programming

موقعي : www.alkhayat-it.com

مواضيع مهمه

-----------------------------------------------:

تعلم كل شىء عن الTriggers

مواضيع مشابهة