منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم برمجة وتطوير المواقع (http://vb4arb.com/vb/forumdisplay.php?fid=51)
+--- قسم : قسم ASP.NET (http://vb4arb.com/vb/forumdisplay.php?fid=52)
+---- قسم : قسم اسئلة ASP.NET (http://vb4arb.com/vb/forumdisplay.php?fid=53)
+---- الموضوع : كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر (/showthread.php?tid=9503)

الصفحات: 1 2 3


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - محمد الحاج خلف - 04-07-13

أختي الكريمة :
حسب معلوماتي فإننا لا نستطيع تمرير بارامتر إلى Trigger فنحن أساسا غير قادرين على طلبه بشكل مباشر , أي أننا لانستطيع طلب تنفيذ الـ Trigger من لغة البرمجة لكي نتمكن من إرسال بارامتر إليه ...
باعتقادي نحن بحاجة إلى فكرة بديلة


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - محمد الحاج خلف - 04-07-13

أختي الكريمة :
حسب معلوماتي فإننا لا نستطيع تمرير بارامتر إلى Trigger فنحن أساسا غير قادرين على طلبه بشكل مباشر , أي أننا لانستطيع طلب تنفيذ الـ Trigger من لغة البرمجة لكي نتمكن من إرسال بارامتر إليه ...
باعتقادي نحن بحاجة إلى فكرة بديلة


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - dena - 04-07-13

محمد الحاج خلف كتب :أختي الكريمة :
حسب معلوماتي فإننا لا نستطيع تمرير بارامتر إلى Trigger فنحن أساسا غير قادرين على طلبه بشكل مباشر , أي أننا لانستطيع طلب تنفيذ الـ Trigger من لغة البرمجة لكي نتمكن من إرسال بارامتر إليه ...
باعتقادي نحن بحاجة إلى فكرة بديلة

فعلا أخي محمد هذا ماأظنه أيضا ولكن ماذا لو استخدمنا store procedure ، بحيث يحمل innput parameter ؟ ولكن كيف يمكنني تمرير القيمة من أداة textbox إلى هذا الباراميتر؟


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - محمد الحاج خلف - 04-07-13

لقد قمت باستخدام Transaction أعتقد أنك على دراية بآلية علمها ... باختصار تقوم Transaction بتنفيذ عبارات sql عديدة فإما أن تنجح جميع هذه العبارات فيتم تثبيتها أو إن حدث خطأ ما عند تنفيذ إحدى العبارات فإنه سيتم التراجع عن تنفيذ جميع ماسبق .
يمكن الاستفادة منها , حيث نريد نحن أن نضمن أن الإضافة ستتم على كلا الجدولين classes و sections أو أن لايتم الإضافة أساسا
بإمكانك أختي الكريمة استخدام هذا الكود :
كود :
[align=left]
SqlConnection myConnect;
        SqlCommand myCommand;
        myConnect = new SqlConnection();
        string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        myConnect.ConnectionString = connectionString;
        myCommand = new SqlCommand();
        myCommand.Connection = myConnect;


        string className = TextBox1.Text;
        string section = TextBox2.Text;

        SqlTransaction transaction;

        myConnect.Open();
        transaction = myConnect.BeginTransaction();
        try
        {

            new SqlCommand("INSERT INTO classes " +
               "(classname) VALUES ('" + className + "');", myConnect, transaction).ExecuteNonQuery();

            new SqlCommand("INSERT INTO sections " +
               "(classno) select top(1) classno from classes order by classno desc;", myConnect, transaction)
               .ExecuteNonQuery();

            new SqlCommand("update sections set section='" + section + "' where secid=(select max(secid) from sections)", myConnect, transaction)
               .ExecuteNonQuery();

            transaction.Commit();
        }
        catch (SqlException sqlError)
        {
            transaction.Rollback();
            Response.Write(sqlError.Message);
        }
        myConnect.Close();
[/align]

على العموم المثال كاملا موجود في المرفقات
تحياتي


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - dena - 04-07-13

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

كود :
[SIZE=2]
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/color][/SIZE][/COLOR][/SIZE][SIZE=2] connstr [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]String[/color][/SIZE][/COLOR][/SIZE][SIZE=2] = ConfigurationManager.ConnectionStrings([/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"ConnectionString"[/color][/SIZE][/COLOR][/SIZE][SIZE=2]).ConnectionString[/SIZE]

[SIZE=2]
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Protected[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Sub[/color][/SIZE][/COLOR][/SIZE][SIZE=2] Button1_Click([/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/color][/SIZE][/COLOR][/SIZE][SIZE=2] sender [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Object[/color][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/color][/SIZE][/COLOR][/SIZE][SIZE=2] e [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2] System.EventArgs) [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Handles[/color][/SIZE][/COLOR][/SIZE][SIZE=2] Button1.Click[/SIZE]
[SIZE=2]        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/color][/SIZE][/COLOR][/SIZE][SIZE=2] cn [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]New[/color][/SIZE][/COLOR][/SIZE][SIZE=2] SqlConnection(connstr)[/SIZE]
[SIZE=2]        cn.Open()
        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/color][/SIZE][/COLOR][/SIZE][SIZE=2] cname [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]String[/color][/SIZE][/COLOR][/SIZE][SIZE=2] = t1.Text[/SIZE]
[SIZE=2]        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/color][/SIZE][/COLOR][/SIZE][SIZE=2] secname [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]String[/color][/SIZE][/COLOR][/SIZE][SIZE=2] = t2.Text[/SIZE]
[SIZE=2]        
        
[/SIZE][SIZE=2][color=#008000][SIZE=2][COLOR=#008000]'-----------------------------------------------------------[/color][/SIZE][/COLOR][/SIZE]
[SIZE=2]        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/color][/SIZE][/COLOR][/SIZE][SIZE=2] myTrans = cn.BeginTransaction()[/SIZE]
[SIZE=2]        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/color][/SIZE][/COLOR][/SIZE][SIZE=2] myCommand [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]New[/color][/SIZE][/COLOR][/SIZE][SIZE=2] SqlCommand()[/SIZE]
[SIZE=2]        myCommand.Connection = cn
        myCommand.Transaction = myTrans
    
        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Try[/color][/SIZE][/COLOR][/SIZE]
[SIZE=2]            myCommand.CommandText =
[/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"insert into t1 (classname) values( '"[/color][/SIZE][/COLOR][/SIZE][SIZE=2] + cname + [/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"')"[/color][/SIZE][/COLOR][/SIZE]
[SIZE=2]            myCommand.ExecuteNonQuery()
            myCommand.CommandText = (
[/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"INSERT INTO sections (classno) select top(1) classno from t1 order by classno desc "[/color][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]            myCommand.ExecuteNonQuery()
            myCommand.CommandText = (
[/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"update sections set section =('"[/color][/SIZE][/COLOR][/SIZE][SIZE=2] + secname + [/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"')where secid =(Select max(secid) from sections"[/color][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]            myTrans.Commit()
            Response.Write(
[/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"Both records are written to database."[/color][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Catch[/color][/SIZE][/COLOR][/SIZE][SIZE=2] ep [/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]As[/color][/SIZE][/COLOR][/SIZE][SIZE=2] Exception[/SIZE]
[SIZE=2]            myTrans.Rollback()
            Response.Write(
[/SIZE][SIZE=2][color=#a31515][SIZE=2][COLOR=#a31515]"Neither record was written to database."[/color][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Finally[/color][/SIZE][/COLOR][/SIZE]
[SIZE=2]            cn.Close()
        
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]End[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Try[/color][/SIZE][/COLOR][/SIZE]
[SIZE=2]    
    
[/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]End[/color][/SIZE][/COLOR][/SIZE][SIZE=2][color=#0000ff][SIZE=2][COLOR=#0000ff]Sub[/color][/SIZE][/COLOR][/SIZE]



كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - محمد الحاج خلف - 04-07-13

أختي الكريمة
لاحظت من خلال قرائتي للكود في الأعلى أنك لم تضعي التعليمة myCommand.ExecuteNonQuery() بعد عبارة التعديل update
وبالتالي فإنها لن تعمل
على العموم سأقوم بتحميل المثال ومعاينة الكود
تحياتي


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - حريف برمجة - 05-07-13

مرحبا مره أخرى ،،،،

الأخ محمد ماقصر الله يجزاه خير ،،، ولكن لي ملاحظتين :

# الملاحظة الأولى : الأخ محمد عمل ثلاث عمليات العملية الأولى : (ادخال اسم الفصل في جدول الفصول) العملية الثانية (ادخال رقم الآيدي للفصل في جدول الشعب) العملية الثالثة (تعديل على جدول الشعب بموجب شرط آخر رقم للآيدي واضافة اسم الشعبة)

بينما هي عمليتين بالأصل (ادخال اسم الفصل في جدول الفصول) و (ادخال رقم الآيدي للفصل واسم الشعبة في جدول الشعب) فقط

# الملاحظة الثانية : والتي اعتبرها مشكلة ان لم تنتبهو لها وشرح المشكلة كالتالي :

ماتفضل به اخي محمد : انه ادخل اسم الفصل ثم جلب آخر رقم للأيدي من جدول الفصل وقام ادخل في جدول الشعب .... هنا المشكلة

لنفرض يوجد في سجل الفصول سجل واحد فقط ،،، بإسم الفصل الأول . والآيدي التابع له رقم 1 .

وقمت انا ادخال اسم الفصل الثاني حيكون الآيدي التابع له رقم 2 .

لنفرض موظف آخر قام بإدخال سجل في نفس الوقت في الجدول . سيكون الآيدي التابع له رقم 3 .

عند تنفيذ الجملة المطروحه من أخي محمد سيجلب آخر رقم للآيدي من الجدول وهنا يكون رقم 3 .... هنا الخطأ .

الحل يكون كالتالي : عند اضافة سجل نجلب الآيدي للسجل نفسه بجملة واحده مع عملية الإدخال :

لاحظو الحل يتكون أولاً من عمليتين وليس ثلاث ، أيضاً رقم الآيدي يكون مخصوص لرقم السجل المضاف وليس آخر سجل اضيف .

كود :
Dim cmd As New SqlCommand
        cmd.Connection = conn
        conn.Open()

        cmd.CommandText = "INSERT INTO classes (classname) OUTPUT(Inserted.classno) VALUES (@classname)"
        cmd.Parameters.AddWithValue("@classname", TextBox1.Text)

        Dim sid As Integer = cmd.ExecuteScalar    'المسؤول عن ادخال البيانات وجلب رقم الآيدي في المتغير
        cmd.Dispose()


        Dim cmd2 As New SqlCommand
        cmd2.Connection = conn

        cmd2.CommandText = "INSERT INTO sections (classno,section) VALUES (@classno,@section)"
        cmd2.Parameters.AddWithValue("@classno", sid)
        cmd2.Parameters.AddWithValue("@section", TextBox2.Text)

        cmd2.ExecuteNonQuery()

        cmd2.Dispose()
        conn.Close()
المثال في المرفقات اي غموض انا موجود / بالتوفيق


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - محمد الحاج خلف - 05-07-13

أخي العزبز حريف برمجة
أصبت بنقطة وهي أني استخدمت ثلاث عبارات SQL في حين إنه بالإمكان استخدام 2 فقط
ولكن للأسف نقاط النقد التالية غير صحيحة
أولا : أنا قمت باستخدام مفهوم المناقلة Transaction وهذا المفوم تم إيجاده للتغلب على المشكلة التي طرحتها أنت , فمن أحد خصائص المناقلة هي خاصية العزل فحتى لو قام موظفان بإدخال البيانات بنفس اللحظة فإن المناقلة ستمييز كل منهما وتعيد لكل شخص نتيجة بحسب عملية إدخاله حتى لو كان الاستعلام يطلب أكبر رقم فإن المناقلة ستميز هذا بالنسبة لكل جلسة
أنصحك أخي العزيز بقراءة مفهوم المناقلة وخصائصها للتوضح لك الأمور أكثر
ثانيا : المشكلة المطروحة في النقطة الأولى قمت أنت بالوقوع بها بالكود الذي كتبته , ماذا لو تمت عملة الإضافة الأولى وفشلت عملية الإضافة الثانية ؟ هل سيتم التراجع تلقائيا عن عملية الإضافة الأولى ؟ الجواب بحسب الكود هو لا
ولكن المناقلة ستقوم بالتراجع عن الإضافة الأولى إذا فشلت الإضافة الثانية , وبهذا نضمن أن النجاح سيكون للكل أو أن لاتتم الإضافة على أحد ( مرة أخرى أنصحك بقراءة مفهوم المناقلات في قواعد البيانات )
ثالثا : أن أقوم بطرح أفكار حلول ولا أقدم أكواد نهائية , ولذلك وجدت 3 عبارات SQL بدلا من 2 وللأخت السائلة إمكانية التعديل بما يناسبها

جزاك الله الخير على تعليقك
تحياتي



كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - حريف برمجة - 05-07-13

اخي محمد اولاً : موضوعي أنا سيتم اضافة البيانات بلا جدال والسبب بأنها اضافه في جدول واضافه أخرى في جدول آخر فقط وليست اضافتين وتعديل وامور اخرى ، ان اختل شرط يتراجع عن الكل .

ثانياً : بالنسبة لموضوعك سيتم اضافتها في الجدولين او لا تتم اضافتها في الجدولين هذا مفهوم الترانسكشن .

ولكن ماذا لو مستخدم آخر اضاف سجل في نفس الوقت سيتم جلب آخر رقم وسيتم الاضافة في الجدولين مش لم تتم الإضافة في الجدول الثاني لكي يتراجع عن الإضافة في الجدول الأول ولكن تكون الإضافة في الجدول الثاني برقم آيدي غير المطلوب.

# او ان لا تتم الإضافة في الجدولين ولماذا اخي وما دخل المستخدم بعجزنا عن الحل السليم ، يدخل بيانات ومن ثم يتراجع البرنامج عن اضافتها .

انا لم اصنع اللغة لكي ادافع عن حلي ولكن هذا الحل السليم الذي اتيت به .

ثالثاً : كررت مفهوم أخي العزيز انصحك بقراءة مفهوم المناقلة وخصائصها . علماً لو اني لم اكن قارئ جيداً لها لكانت مره واحده تكفي ان تقولها .

على العموم انا قلت رأي من شاء اخذه ومن لم يشأ لا يشأ .

اقرأ هذا الرابط شوف السؤال : وانظر لأول اجابة ....

http://stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row


كيف يمكنني عمل trigger يقوم بإضافة بيانات حقل من جدول ما إلى حقل في جدول آخر - محمد الحاج خلف - 05-07-13

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

شكرا لمجهودك وشكرا لرأيك لكل مبرمج أسلوبه ولكل أسلوب نقاط قوة وعيوب
تحياتي :o