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

كيف أنشئ Stored Procedure

مغلق
بدأه ندى الصباح في 12 يوليو 2005 · 26 رد · 4,236 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

لقد تعبت كثيرا من محاولات إنشاء Stored Procedure في SQLServer وأيضا من كيفية الاستفادة منها من خلال بيئة VB.Net كاستدعائها وأخذ النتائج وتمرير الParameters .. إلخ إلخ

مع أني قرأت بعض الأمثلة إلا أني لم أستوعب ذلك ..

وقد بحثت في المنتدى على مواضيع مشابه ولكنها لم تسعفني ..

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

#2

ال Stored Procedure هي عباره عن مجموعه من الاجراءات المخزنه وجاهزه للتنفيذ علي جدول موجود في قاعدة بيانات وهي تكون مكتوبه بلغة SQL وبغض النظر عن كود الفيجوال بيسك يمكن انشاءها كالتالي :

CREATE PROCEDURE <stored procedure name>
<@first parameter name> <type>,
<@seconed parameter name> <type>
AS
INSERT INTO <table>(Column 1,Column 2) VALUES(<@first parameter name>,<@seconed parameter name>)

Example:

CREATE PROCEDURE NewEmployee
@Name nvarchar(50),
@Age int
AS
INSERT INTO EMPLOYEE (name,age) VALUES (@NAME,@AGE)

وبلغة فيجوال بيسك يمكن تنفيذها عن طريق استخدام Command Objectووضع الكود السابق في خاصية ال String ...,,,

ملحوظه : منذ 3 أيام فقط لم أكن أعرف شيئا عما قلت لكن الفضل لله سبحانه وتعالي ثم أخواني المنتدي

/index.php?showtopic=69867

تم تعديل هذه المشاركة بواسطة hazzoom في 12 يوليو 2005 في 19:36

#3

حاولت ارسال المثال في مرفق ولكن لم يصلح ,,,

http://dl3.rapidshare.de/files/3004201/418...edProcedure.rar

تم تعديل هذه المشاركة بواسطة hazzoom في 12 يوليو 2005 في 21:32

#4

جزاك الله خير

لا أعرف كيف أشكرك على جهودك بارك الله فيك

حقيقة لقد استفدت مما سبق ولكن عندي إضافة وهو كيفية استرجاع سجلات بناء على Parameter لأن ماسبق كان يوضح كيفية تخزين بيانات باستخدام Stored Procedure ،، أما في حالة العكس وهي مثلا أريد البحث عن إسم موظف معين وإحضار سجل بياناته بالكامل وذلك باستخدام Stored Procedure ، كيف يتم ذلك ؟

شاكرا ومقدرا جهودكم ووقتكم القيم

#6

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

طيب ،، أريد أحد من أهل الخبرة يساعدنا ،،

#7

مثال عالطاير

SELECT * FROM EMPLOYEE WHERE EMP_NAME LIKE '%' & @EMP_NAME & '%'

حيث @EMP_NAME هو البارمتر طبعاً. هذا الكويري سيبحث عن أي موظف يتضمن اسمه الإسم الموجود في البارامتر. اذا وضعت الإسم "محمد" مثلاً سيرجع الأخوان "محمد عبد السميع" و "عبدالله محمد" و "سعيد محمد سعيد" و هكذا.

#8

سأجرب المثال عالطاير وشوف .. مشكور

#9

لكي نستخدم ال Stored Procedure في البحث عن بيانات داخل جدول يجب أن يكون ال Stored

Procedure يحتوي علي جملة sql للبحث كالتالي :

CREATE PROCEDURE hazemoutpro
@nam  nvarchar(50) output, 
@num int output 
AS 
SELECT name FROM hazemtab WHERE number = @nam

ونلاحظ أنه أمام ال Parameter كتبنا out لأنه يستخدم في استخراج البيانات وليس ادخالها.

أما عن طريقة استخدامه مع ال VB.NET فهي مشابهه للمثال السابق ولكن للأسف حاولت فيها ولم

أصل وأرجو ممن لديه الخبره وضع مثال ,,,

#10

اذا كنت ستعيد row كامل أو حتى جزء منه فأنت لست بحاجة الى بارامتر إخراج. يمكنك أن تخرج البيانات الى Dataset أو Datareader

مثال تاني عالطاير

dim ds as new dataset 
dim adpt as new sqldataadapter
dim conn as sqlconnection
dim cmd as sqlcommand 

conn=new sqlconnection("......connection string....")

cmd = new sqlcommand("SP_SELECT_EMPLOYEE")
cmd.connection = conn
cmd.commandtype=commandtype.storedprocedure
cmd.parameters.add( new parameter("@name"))
cmd.parameters("@name")="محمد"

adpt.selectcommamd = cmd

adpt.fill(ds)

SP_SELECT_EMPLOYEE هو اسم الـstored procedure (أو SPROC كما يختصرها البعض) يحتوي على أمر الكويري في المثال السابق.

تم تعديل هذه المشاركة بواسطة System Down في 16 يوليو 2005 في 03:35

#11

أنا عايز أستخدم Parameter لاستخراج الناتج أي يكون للـ output وليس للـ input ,

ثانيا فين جملة ال sql الخاصه بالـ Stored Procedure اللي انت كتبته ؟؟؟,

("SP_SELECT_EMPLOYEE")

حد يساعدنا يا جماعه ................ :( :( :(

تم تعديل هذه المشاركة بواسطة hazzoom في 16 يوليو 2005 في 18:17

#12

ممكن تعمل الـstored procedure هكذا

CREATE PROCEDURE SP_GET_FIRST_NAME
@EMP_ID INT,
@FIRST_NAME VARCHAR(200) OUT
AS

SET @FIRST_NAME = (SELECT FIRST_NAME  FROM EMPLOYEE WHERE EMP_ID=@EMP_ID)

GO

ثم استعمل الكود

dim cmd as new sqlcommand
.
.
.
cmd.commandtext="SP_GET_FIRST_NAME"
cmd.commandtype = commandtype.storedprocedure

cmd.parameters.add(new sqlparameter("@EMP_ID"))
cmd.parameters.add(new sqlparameter("@FIRST_NAME"))
cmd.parameters.item("@EMP_ID").Value = 123
cmd.parameters.item("@FIRST_NAME").Direction = ParameterDirection.Output

conn.open
cmd.excecutenonquery
conn.close

console.write(cstr(cmd.parameters.item("@FIRST_NAME")))
#13

شكرا للإخوة

أخي System Down بارك الله فيك وما قصرت

يوجد خطأ في الكود لم أستطع تصحيحه وذلك في السطريين التاليين :

cmd.parameters.add(new sqlparameter("@EMP_ID"))
cmd.parameters.add(new sqlparameter("@FIRST_NAME"))

أيضا أريد أن توضح كيف أضيف النتائج إلى DataGrid

وأكون لك من الشاكرين

#14

للرفع

#15
cmd.parameters.add("@EMP_ID")
cmd.parameters.add("@FIRST_NAME")

أي datagrid تقصد؟ الخاصة بالويب أم بالويندوز كلاينت؟

على العموم، لوضع البيانات في datagrid يجب أن تكون داخل كائن قابل للتعداد Numerable مثل الـDataset أو Datatable أو حتى مصفوفة. ثم تسندها الى الخاصية DataSource في الـDatagrid. ثم تنادى العملية Databind في الـdatagrid

#16

أيضا ظهرت لي رسالة عندما ضغطت على Button1 والذي يقوم بتنفيذ البحث

مع أن الكود لا يوجد به أخطاء

أرفقت صورة بها الرسالة يرجى الإطلاع والمساعدة في معرفة السبب

post-42651-1121706663_thumb.jpg

#17

يبدو أنني مدروخ كما نقول في السعودية. أخطائي كثيرة اليومين هاذي! :)

comm.parameters.add("@FIRST_NAME", SqlDbType.Varchar)
comm.parameters.add("@EMP_ID", SqlDbType.Int)
#18

Dont warry, Its normal

تحصل في أحسن العائلات

الحمد لله الواحد الأحد

لقد استطعت إلى الآن بفضل الله ثم بفضل الأخ System Down والأخ hazzoom بناء بروسيجرين واحد لإضافة مؤسسة جديدة والثاني لإحضار إسم مؤسسة بمعرفة رقمها كالتالي

بروسيجر الإضافة:

ALTER PROCEDURE dbo.AddEsts
@EstID numeric,
@Name nvarchar(100)
AS
INSERT INTO aEsts (EstID,Name) VALUES (@EstID,@Name)

بروسيجر بحث بواسطو الـID ويعيد إسم المؤسسة:

ALTER PROCEDURE dbo.SearchEstsID
	@EstID numeric,
	@Name nvarchar(100) OUT
AS
	SET @Name= (SELECT Name  FROM aEsts WHERE EstID=@EstID)

الكود المستخدم للبروسيجر الأول:

        'Add
        Dim cmd As New SqlClient.SqlCommand("AddEsts", SqlConnection1)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.Add("@EstID", SqlDbType.Decimal, 9).Value = _EstID.Text
        cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 100).Value = _EstName.Text
        Try
            SqlConnection1.Open()
            cmd.ExecuteNonQuery()
            SqlConnection1.Close()
            MsgBox("Ok.")
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

الكود المستخدم للبروسيجر الثاني:

        'Search By ID
        Dim cmd As New SqlClient.SqlCommand
        cmd.CommandText = "SearchEstsID"
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Connection = SqlConnection1

        cmd.Parameters.Add("@EstID", SqlDbType.BigInt, 9)
        cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100)
        cmd.Parameters.Item("@EstID").Value = TextBox1.Text
        cmd.Parameters.Item("@Name").Direction = ParameterDirection.Output

        SqlConnection1.Open()
        cmd.ExecuteNonQuery()
        SqlConnection1.Close()

        MsgBox(cmd.Parameters.Item("@Name").Value)

الآن بقي لي خطوة واحدة وهي أهم خطوة بالنسبة لي لأنها هي التي أردتها. أريد أن أعيد صياغة البروسيجر2 الخاص بإحضار إسم المؤسسة بمعلومية رقمها إلى التالي:

بروسيجر لإحضار السجل الكامل للمؤسسة أو لأكثر من مؤسسة بمعلومية جزء من إسم المؤسسة

بعد ذلك تخزين النتائج (السجلات المرتجعة) في DataSet ، وهذه الداتاسيت هي داتاسورس لـDatagrid1 الموجودة على Windows Form

*** أرجو توضيح البروسيجر والكود الخاص به وبلاش من الدروخة لأني بدأت أتدروخ***

أعتذر على كثرة أسألتي وأشكر لكم متابعت مشكلتي وجزاكم الله خيرا

تم تعديل هذه المشاركة بواسطة ندى الصباح في 19 يوليو 2005 في 20:47

#19

للبحث بجزء من الإسم (أو الرقم) نستعمل Like بدلاً من =. و كذلك نستخدم الوايلد كارد. _ تعني أي حرف و % تعني أي مجموعة من الحروف.

مثلاً:

SELECT * FROM aEsts WHERE EstID LIKE '9%' 

SELECT * FROM aEsts WHERE EstID LIKE '%9%' 

SELECT * FROM aEsts WHERE EstID LIKE '9_'

الأول: يبحث عن جميع السجلات التي بيدأ رقمها ب9

الثاني: يبحث عن جميع السجلات التي في وسطها 9

الثالث: يبحث عن جميع السجلات التي بيدأ رقمها ب9 و بعدها محرف واحد بالضبط.

تصبح الكويري هكذا. من غير output parameter

SELECT Name  FROM aEsts WHERE EstID LIKE '%' + @EstID + '%'

كود الإستدعاء

Dim ds as new Dataset
dim adpt as new SqlDataAdapter
.
.
عرف الكونكشن و الكوماند
.
.
adpt.selectcommand = comm

adpt.fill(ds)

 conn.close
#20

:wacko: :s :wacko:

حاولت تطبيق ذلك ولكن ظهرت لي رسالة System error , وتوقف المؤشر عند da.fill(ds)

ممكن تعرفني فين الخطأ ؟؟ :

الكود :

        Dim cmd As New SqlClient.SqlCommand("SearchEstsName", SqlConnection1)
        cmd.CommandType = CommandType.StoredProcedure

        Dim da As New SqlClient.SqlDataAdapter(cmd)
        Dim ds As New DataSet

        cmd.Parameters.Add("@EstID", SqlDbType.BigInt, 9)
        cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100)

        da.Fill(ds)
        DataGrid1.DataSource = ds

علما بأن على الفورم حقل وزر وداتاجريد ، في الحقل يتم إدخال جزء من إسم المؤسسة وعند الضغط على الزر تظهر النتائج في الداتاجريد

وهذا هو البروسيجر:

ALTER PROCEDURE dbo.SearchEstsName
	@EstID numeric  ,
	@Name nvarchar(100) 
AS
	SELECT *  FROM aEsts WHERE Name LIKE '%' + @Name + '%'

ملاحظة: في البروسيجر السابق أنا لاأريد أن أعرف متغيرات معينة:

	@EstID numeric  ,
	@Name nvarchar(100)

لأني أريد استرجاع كل الحقول، فكيف يتم ذلك ؟؟

:D :D :D

أرجو تفصيل الرد على السؤالين جزاك الله خيرا

تم تعديل هذه المشاركة بواسطة ندى الصباح في 20 يوليو 2005 في 12:20

#21

da.selectcommand = cmd

و لا تنسي

sqlconnection1.close

و الكويري لرد جميع السجلات هو نفسه من غير الـwhere

SELECT * FROM aEsts

و استعماله بنفس الطريقة و لكن لا توجد بارامترات طبعاً.

تم تعديل هذه المشاركة بواسطة System Down في 20 يوليو 2005 في 12:49

#22

(da.selectcommand = cmd)

أنظر:

Dim da As New SqlClient.SqlDataAdapter(cmd)

لقد وضعته في تعريف da

ولا أحتاج إلى

(sqlconnection1.close)

لأن da يقوم بذلك

أما:

(و الكويري لرد جميع السجلات هو نفسه من غير الـwhere

SELECT * FROM aEsts )

أنا أريد Where لأني لا أريد جميع السجلات، أريد السجلات التي تحقق الشرط فقط وهو أن يحتوي إسم المؤسسة

على الجزء الذي يحدده المستخدم (لذلك سأحتاج إلى باراميتر لإسم المؤسسة)

ولكني في نفس الوقت أريد جميع حقول الجدول أن تظهر في الداتا جريد وهي ليست فقط حقلين

اسم المؤسسة، ورقمها ولكن هناك أيضا رقم الهاتف والفاكس ورقم السجل التجاري واسم صاحب المؤسسة والفئة ووو.. أكثر من 30 حقل

أشكرك على مجهودك معي جعله الله في ميزان حسناتك.

#23

ممكن نص الخطأ؟

أما بالنسبة للكويري، فهمت أنه تريدي جميع الحقول؟

اذن استعملي * بدلاً من اسم الحقول في الكويري و هو سيأتي بجميعها.

#24

أوكي

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

البروسيجر وظيفته استرجاع جميع حقول جدول المؤسسات وجميع السجلات التي تحقق الشرط ، والشرط هو : الاسم أو جزء من الاسم يحدده المستخدم.

هنا مشكلتي وهي كتابة البروسيجر الكامل بالشكل الصحيح...

هذا الموضوع مغلق.

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

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

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

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

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