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

سؤال عن كيفية استخدام Stored procedure

بدأه c_vita في 27 يونيو 2010 · 3 رد · 3,344 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم وكيف حال الجميع

اخوانى ابحث عن رابط اجد فيه شرح لكيفية التعامل مع الـ( Stored procedure ) واتمنى ان يحتوى على مثال ولو بسيط

كل ما اريده هو مدخل او نبذة بسيطة للتعامل مع قواعد بيانات ( sql server ) عن طريق الـ( Stored procedure )

جزاكم الله خيرا مقدما

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وزدنا علما

#2

السلام عليكم...

الإجراءات المخزنة (Stored Procedures) هي أدوات فعالة في SQL Server حيث يمكنك أن تستعمل فيها جمل لغة SQL بالإضافة إلى مجموعة من الجمل البرمجية مثل IF و WHILE ... إلخ. بالإضافة إلى أنه يمكنك تعريف متغيرات (Variables) داخل الإجراء و استدعاء إجراءات أو دوال أخرى، كما يمكن أن يكون للإجراء بارامترات (Parameters) لتمرير قيم إلى الإجراء عند استدعائه.

استعمال الإجراءات المخزنة مفيد من ناحيتين: سرعة التنفيذ لأن كل التعليمات البرمجية و منطق الإجراء موجود على الـ Server نفسه (حيث توجد قاعدة البيانات)، و تجنب إرسال سلاسل طويلة من نصوص SQL عبلا الشبكة إذا كان برنامجك يعمل على فاعدة بيانات عبر الشبكة. بالإضافة إلى ذلك فإنك في حالة احتجت إلى تعديل الإجراء فإنك تقوم بتعديله على الـ Server دون أن تكون مضطراً إلى تعديل برنامجك و إنشاء نسخة تنفيذية جديدة من أجل التعديل.

يتم إنشاء الـ Stored Procedure بالنقر بالزر الأيمن على البند Stored Procedures التابع لقاعدة البيانات التي تتعامل معها، و اختيار الأمر New Stored Procedure من القائمة حيث تفتح نافذة لكتابة كود الإجراء.

الشكل العام للإجراء كالتالي:

CREATE PROCEDURE procedure_name [parameters]
AS
...
procedure_statements
...

حيث:

procedure_name هو اسم الإجراء.

parameters بارامتر واحد أو أكثر إذا كان الإجراء يحتاج إلى تمرير قيم عند استدعائه (اختياري). البارامترات تكون بالشكل التالي:

@param1 type1, @param2 type2, ...
مثلاً
@CustID int, @Address nvarchar(100)

لاحظ أن أسماء البارامترات تبدأ بالعلامة @. و نحدد لكل بارامتر نوعه حسب أنواع البيانات المعرفة ضمن SQL Server.

procedure_statements هي مجموعة الجمل التي سيقوم الإجراء بتنفيذها، و التي قد تشمل تعريف متغيرات و جمل SQL و جمل تحكم برمجية و إنشاء مجموعات سجلات... إلخ.

إذا أردنا التصريح عن متغير أو أكثر فإن التصريح يكون كالتالي:

DECLARE @var1 type1, @var2 type2, ...
مثلاً
DECLARE @CustID int, @Address nvarchar(100)

الجمل داخل الإجراء يمكن أن تحتوي أيضاً على عبارة RETURN لإعادة قيمة معينة و الخروج من الإجراء. يمكنك استعمال عبارة RETURN لنبين حالة الإجراء، مثلاً إذا نجح في تنفيذ المطلوب نعيد 0 و إذا حدث خطأ نعيد 1.

المثال التالي هو جزء من إجراء مخزن (Stored Procedure) في قاعدة بيانات لأحد برامجي (منظومة مخازن و مبيعات):

CREATE PROCEDURE P_CheckPredefinedData (@AUserID int)
AS
	IF (SELECT COUNT(*) FROM Level1 WHERE (L1ID = 0)) = 0 BEGIN
		SET IDENTITY_INSERT Level1 ON
		INSERT INTO Level1 (L1ID, L1Name, Present, EditorID, EditDate) 
			VALUES (0, '[غير مصنف]', 1, @AUserID, getdate())
		SET IDENTITY_INSERT Level1 OFF
	END
GO

التوضيح:

P_CheckPredefinedData هو اسم الإجراء. هذا الإجراء له بارامتر واحد باسم @AUserID من النوع int.

جملة IF تختبر ما إذا كان هناك سجلات في الجدول Level1 تكون فيها قيمة الحقل L1ID مساوية للصفر. فإذا كانت النتيجة صفراً (لا يوجد سجل فيه الحقل L1ID = 0) فإن الإجراء يقوم بتنفيذ بقية الجمل.

الجملة SET IDENTITY_INSERT Level1 ON تجعل SQL Server يسمح لنا بإدخال قيمة في حقل يحمل صفة IDENTITY (حقل ترقيم تلقائي).

جملة INSERT و ما يتبعها هي لإدراج سجل جديد في الجدول Level1. لاحظ أننا هنا وفرنا البيانات للسجل بثلاث طرق:

بإعطاء قيم صريحة مثل 0 و 1 و [غير مصنف].

باستعمال قيمة البارامتر @AUserID.

باستعمال دالة من دوال SQL Server هي الدالة getdate() للحصول على التاريخ و الوقت الحاليين.

و الجملة الأخيرة SET IDENTITY_INSERT Level1 OFF تجعل SQL Server يمنع إدخال قيمة في حقل يحمل صفة IDENTITY (و هو الوضع الطبيعي).

الاستدعاء من داخل دلفي:

لاستدعاء Stored Procedure من داخل برنامج دلفي أضف المكون TADOStoredProc. اضبط الخاصية ConnectionString لهذا المكون أو اربطه مع مكون TADOConnection من خلال الخاصية Connection.

اذهب إلى الخاصية ProcedureName. يجب أن تظهر لك قائمة بأسماء الإجراءات المخزنة في قاعدة البيانات التي تتعامل معها. اختر اسم الإجراء المطلوب.

إذا كان للإجراء بارامترات فيمكنك التأكد منها بالنقر على الخاصية Parameters. ستجد مع البارامترات التي عرفتها أنت للإجراء بارامتراً إضافياً باسم @RETURN_VALUE الذي يحتوي على القيمة المعادة من الإجراء.

و في الكود يتم استدعاء الإجراء باستدعاء الوظيفة ExecProc للمكون TADOStoredProc. و إذا كان له بارامترات فيجب تحديد قيمها قبل استدعاء الإجراء، كما في المثال التالي:

    ADOStoredProc1.Parameters.ParamValues['@AUserID'] := 5;
    ADOStoredProc1.ExecProc;

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#3

مشكور استاذنا ناجي

procedure TForm3.BitBtn1Click(Sender: TObject);
var
proctrans:TADOStoredProc;
d2:TDate;
begin
   img6.Visible:=false;
   image1.Visible:=false;
   image2.Visible:=false;
   d2:= EncodeDate(YearOf(DateTimePicker1.date),MonthOf(DateTimePicker1.date),DayOf(DateTimePicker1.date));

 begin
  IF Trim(edt2.Text) ='' THEN BEGIN   img6.Visible:=true;EXIT; END;
  IF Trim(edt3.Text) ='' THEN BEGIN   image1.Visible:=true;EXIT; END;
  IF Trim(edt5.Text) ='' THEN BEGIN   image2.Visible:=true;EXIT; END;


   try


  DM.ADOConnection1.BeginTrans;
  proctrans :=TADOStoredProc.Create(nil);
  proctrans.Connection:=DM.ADOConnection1 ;

  proctrans.ProcedureName :='addfact';
  proctrans.Parameters.Refresh;


  proctrans.Parameters.ParamByName('@id_artical').Value :=  edt22.text;
  proctrans.Parameters.ParamByName('@artical').Value :=  edt2.text;
  proctrans.Parameters.ParamByName('@id_mos').Value :=  edt26.text;
  proctrans.Parameters.ParamByName('@id_dealer').Value := edt23.text;
  proctrans.Parameters.ParamByName('@dealer').Value :=  edt3.text;
  proctrans.Parameters.ParamByName('@id_c_t').Value :=  edt24.text;
  proctrans.Parameters.ParamByName('@com_tra').Value :=  edt4.text;
  proctrans.Parameters.ParamByName('@date_it').Value :=  d2;
   pb1.Position:=60;
  proctrans.Parameters.ParamByName('@set_hold').Value := edt16.Text;
  proctrans.Parameters.ParamByName('@id_card').Value := edt6.Text;
  ///////////////////////////////////////////////////
  if DM.Qryselectkind.Fields.FieldByName('id').Value =1 then
  begin
   proctrans.Parameters.ParamByName('@quant').Value := edt8.text;
   proctrans.Parameters.ParamByName('@quant2').Value := '0';
  end;
  ////////////////////////
  if DM.Qryselectkind.Fields.FieldByName('id').Value =2 then
   begin
   proctrans.Parameters.ParamByName('@quant').Value :=  '0';
   proctrans.Parameters.ParamByName('@quant2').Value := edt8.text;
  end;
  //////////////////////////
	if DM.Qryselectkind.Fields.FieldByName('id').Value =3 then
  begin
   proctrans.Parameters.ParamByName('@quant').Value := '0';
   proctrans.Parameters.ParamByName('@quant2').Value := edt8.text;
  end;
  /////////////////////////
  if DM.Qryselectkind.Fields.FieldByName('id').Value =4 then
   begin
   proctrans.Parameters.ParamByName('@quant').Value :=  edt8.text;
   proctrans.Parameters.ParamByName('@quant2').Value := '0';
  end;
  ////////////////////////////
	if DM.Qryselectkind.Fields.FieldByName('id').Value =5 then
  begin
   proctrans.Parameters.ParamByName('@quant').Value := edt8.text;
   proctrans.Parameters.ParamByName('@quant2').Value := '0';
  end;
  ////////////////////////
  if DM.Qryselectkind.Fields.FieldByName('id').Value =6 then
   begin
   proctrans.Parameters.ParamByName('@quant').Value :=  '0';
   proctrans.Parameters.ParamByName('@quant2').Value := edt8.text;
  end;
  proctrans.Parameters.ParamByName('@solaf').Value := edt9.Text;
  proctrans.Parameters.ParamByName('@sal').Value := edt10.Text;
  proctrans.Parameters.ParamByName('@sal_d').Value := edt11.Text;
  proctrans.Parameters.ParamByName('@sum_sal').Value := edt12.Text;
  proctrans.Parameters.ParamByName('@tagr').Value := edt13.Text;
  proctrans.Parameters.ParamByName('@taq_tah').Value := edt14.Text;
  proctrans.Parameters.ParamByName('@tag_mor').Value := edt15.Text;
  proctrans.Parameters.ParamByName('@sal1').Value := edt17.Text;
  proctrans.Parameters.ParamByName('@taq_tah2').Value := edt18.Text;
  proctrans.Parameters.ParamByName('@taq_mor2').Value := edt19.Text;
  proctrans.Parameters.ParamByName('@sum_s').Value := edt20.Text;
  proctrans.Parameters.ParamByName('@sum_ala').Value := edt21.Text;
  proctrans.Parameters.ParamByName('@id_iteam').Value := edt25.Text;
  proctrans.Parameters.ParamByName('@iteam').Value := edt5.Text;

  proctrans.Parameters.ParamByName('@drivern').Value := edt27.Text;
   proctrans.Parameters.ParamByName('@Tel1').Value := 'NO';
  proctrans.Parameters.ParamByName('@id_kind').Value := EDT32.text;
  proctrans.Parameters.ParamByName('@kind_H').Value := cbb1.text;
  proctrans.Parameters.ParamByName('@id_chahen').Value :=edt34.text;
  proctrans.Parameters.ParamByName('@card_driver').Value := 'NO';
  proctrans.Parameters.ParamByName('@id_numcar').Value := edt35.Text;
  proctrans.Parameters.ParamByName('@number_car').Value := edt7.Text;
  proctrans.Parameters.ParamByName('@id_store').Value := EDT33.text;
  proctrans.Parameters.ParamByName('@name_store').Value := cbb2.text;
  proctrans.Parameters.ParamByName('@tabriz').Value := EDT29.text;
  proctrans.Parameters.ParamByName('@chahen').Value := cbb3.text;

  proctrans.Parameters.ParamByName('@id_dele2').Value := EDT30.text;
  proctrans.Parameters.ParamByName('@name_dele2').Value := edt28.text;
  proctrans.Prepared:=True;
  try
   proctrans.ExecProc;
  finally
   proctrans.Free;

  end;


 	if dm.ADOConnection1.InTransaction then begin dm.ADOConnection1.CommitTrans;


   end;



  except
 	on E:exception do begin

   if DM.ADOConnection1.InTransaction then
 	DM.ADOConnection1.RollbackTrans;
 	MsgText := 'حدث خطأ أثناء محاولة حفظ البيانات'
 	+ #13#10 + E.Message;
 	ShowMessage(MsgText);
  	pb1.Visible:=False;
   end;

  end;


   pb1.Visible:=False;

end;
end;

وهذا شكلها ضمن اسكل سيرفر

USE [trans]
GO
/****** Object:  StoredProcedure [dbo].[addfact]	Script Date: 07/05/2010 01:31:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER procedure [dbo].[addfact] 
(

@id_artical   int,
@artical  	varchar(13),
@id_mos   	int,
@id_dealer	int,
@dealer   	varchar(13),
@id_c_t   	int,
@com_tra  	varchar(13),
@date_it  	datetime,
@set_hold 	SMALLMoney,
@id_card  	int,
@quant    	float,
@solaf    	smallmoney,
@sal      	float,
@sal_d    	float,
@sum_sal  	float,
@tagr 		smallmoney,
@taq_tah  	smallmoney,
@tag_mor  	SMALLMoney,
@sal1 		float,
@taq_tah2 	smallmoney,
@taq_mor2 	smallmoney,
@sum_s    	float,
@sum_ala  	float,
@id_iteam 	int,
@iteam    	varchar(13),
@drivern  	varchar (20),
@Tel1 		varchar(20),
@id_kind  	int,
@kind_H   	varchar(20),
@id_chahen 	int,
@card_driver  varchar(20),
@number_car   varchar(20),
@id_store  	int,
@name_store	varchar(20),
@quant2    	float,
@tabriz    	money,
@chahen    	varchar(20),
@id_dele2  	int,
@name_dele2	varchar(50),
@id_numcar 	int
)
AS BEGIN INSERT INTO fact
(id_artical,artical,id_mos,id_dealer,dealer,id_c_t,com_tra,date_it,set_hold,id_card,quant,solaf,sal,sal_d,sum_sal,tagr,taq_tah,Tag_mor,sal1,taq_tah2,taq_mor2,sum_s,sum_ala,id_iteam,iteam,
driverN,Tel1,id_kind,kind_h,id_chahen,card_driver,Number_car,id_store,name_store,quant2,tabriz,chahen,id_dele2,name_dele2,id_numcar)


VALUES
(@id_artical,@artical,@id_mos,@id_dealer,@dealer,@id_c_t,@com_tra,@date_it,@set_hold,@id_card,@quant,@solaf,@sal,@sal_d,@sum_sal,@tagr,@taq_tah,@Tag_mor,@sal1,@taq_tah2,@taq_mor2,@sum_s,@sum_ala,@id_iteam,@iteam,
@drivern,@Tel1,@id_kind,@kind_H,@id_chahen,@card_driver,@number_car,@id_store,@name_store,@quant2,@tabriz,@chahen,@id_dele2,@name_dele2,@id_numcar)
END

وهناك مشاركة قيمة للاساتذه ناجي وذكيري ودلول , ابحث في المنتدى عنها

تم تعديل هذه المشاركة بواسطة طلال بلال في 5 يوليو 2010 في 01:38

1
#4

شكرا على المجهود اريد من الاخ ناجى يوضج لى كيف استخدم Stored procedure فى interbase و استعدائها فى الدولفن اخوك جديد فى لبرمجة

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…