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

الحفظ في جدولين مرتبطين بالكود

بدأه رحيّم في 14 مارس 2013 · 9 رد · 2,864 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أساتذتي الكرام :::

تعبت وأنا أبحث عن كود لحفظ جدولين مرتبطين بعلاقة رأس إلى أطراف

ولقد قمت بعملية الربط باستخدام مطول (لأنني مبتدئ) لجملة Relations وإليكم توضيح لمثل ما قمت به في الأكواد التاليةولقد قمت بعملية الربط باستخدام مطول (لأنني مبتدئ) لجملة Relations وإليكم توضيح لمثل ما قمت به في الأكواد التالية

 

Dim cmd As SqlCommand = New SqlCommand("SELECT * from stu_data ", con)
            SQLDataAdapter1 = New SqlDataAdapter(cmd)
            Dim builder As SqlCommandBuilder = New SqlCommandBuilder(SQLDataAdapter1)
            SQLDataSet1 = New DataSet()
            SQLDataAdapter1.Fill(SQLDataSet1, "stu_data")

 Dim cmd20 As SqlCommand = New SqlCommand("SELECT * from course ", con)
            SQLDataAdapter20 = New SqlDataAdapter(cmd20)
            Dim builder20 As SqlCommandBuilder = New SqlCommandBuilder(SQLDataAdapter20)
            SQLDataSet20 = New DataSet()
            SQLDataAdapter20.Fill(SQLDataSet20, "course")

 Dim cmd30 As SqlCommand = New SqlCommand("SELECT * from Family ", con)
            SQLDataAdapter30 = New SqlDataAdapter(cmd30)
            Dim builder30 As SqlCommandBuilder = New SqlCommandBuilder(SQLDataAdapter30)
            SQLDataSet30 = New DataSet()
            SQLDataAdapter30.Fill(SQLDataSet30, "Family")



            BindingSource1 = New BindingSource(SQLDataSet1, "stu_data")
            BindingSource11 = New BindingSource(SQLDataSet20, "course")
            BindingSource12 = New BindingSource(SQLDataSet30, "Family")


            stu_no.DataBindings.Add("Text", BindingSource1, "stu_no", True, 1, "")
            stu_name.DataBindings.Add("text", BindingSource1, "stu_name", True, 1, "")
            stu_zone.DataBindings.Add("text", BindingSource1, "stu_zone", True, 1, "")
            stu_address.DataBindings.Add("text", BindingSource1, "stu_address", True, 1, "")
  stu_contry.DataBindings.Add("SelectedValue", BindingSource1, "stu_contry", True, 1, "")




            data.Locale = System.Globalization.CultureInfo.InvariantCulture
            data2.Locale = System.Globalization.CultureInfo.InvariantCulture

            SQLDataAdapter1.Fill(data, "stu_data")
            SQLDataAdapter20.Fill(data, "course")
            SQLDataAdapter1.Fill(data2, "stu_data")
            SQLDataAdapter30.Fill(data2, "Family")



            Dim relation1 As New DataRelation("stu_datacourse", data.Tables("stu_data").Columns("stu_no"), data.Tables("course").Columns("cou_stu_no"))
            Dim relation2 As New DataRelation("stu_dataFamily", data2.Tables("stu_data").Columns("stu_no"), data2.Tables("Family").Columns("Fam_stu_no"))

            data.Relations.Add(relation1)
            data2.Relations.Add(relation2)

            BindingSource1.DataSource = data
            BindingSource11.DataSource = data2

            BindingSource1.DataMember = "stu_data"
            BindingSource11.DataMember = "stu_data"
            BindingSource13.DataMember = "stu_data"


            'انشاء بندج سورز جديد وادراج الداتاست والجدول بداخله
            BindingSource20 = New BindingSource(SQLDataSet20, "course")
            bindingsource30 = New BindingSource(SQLDataSet30, "Family")

            bindingsource20.DataSource = BindingSource11
            bindingsource20.DataMember = "stu_datacourse"

            bindingsource30.DataSource = BindingSource12
            bindingsource30.DataMember = "stu_dataFamily"


            ' SQL كود ربط داتا جريد بقاعدة البيانات
            DataGridView1.DataSource = BindingSource20
            DataGridView2.DataSource = bindingsource30

 

أنا أعتقد ( بل أكاد أجزم ) بأنني طولت وكررت في الكود ولكن هذا ما وصل إليه فهمي .... ويمكنكم توجيهي

 

مشكلتي الآن ::

 

** ماذا أكتب في كود الحفظ والحذف... لأنني عند إضافة سجل جديد رقم الطالب ( stu_no ) حقل ترقيم بالكود - يعني يبحث عن أعلى رقم ويزيده 1 - بمعنى أنه في قريد الدورات عندما أضيف سجل جديد أو سجلين لهذا الطالب سيكون حقل الربط ( cou_stu_no ) فاضي ولن يقبل الحفظ ..

والعفو منكم

#3

جزاك الله خيراً على إرشادك

أستاذي الفاضل : لقد رأيت هذا الموضوع عدة مرات وحاولت أن أفهمه أو أطبقه فباءت محاولاتي بالفشل 

هل يمكنك توضيحه لي بشكل أفضل ؟ ويكون بكود vb.net  وليس C#

#4

هل من معين

#5

أخي الفاضل

مرفق مثال بداخلة SQL Database + مشروع مصمم بالفيجوال بيسك يوضح طريقة الحفظ داخل جدولين مرتبطين رأس بأطراف

 

بالتوفيق

invoice.zip

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#6

شكر اخي محمد لقد سبقتني

 

بنسبه للموضوع الرابط الكود الاول في السكول وه عمل الsql server stored procedure وفكرته عمله هو ارسال كلا قيم الجدولين الي السكول ثم عمل Transaction تقم بعمل ادخال مؤقت في الجدول الاول ثم اخد رقم التسلسل ادخالة في الجدول الاخر بشكل مؤقت واذا تم الادخال الصحيح في كلا الجدولين تقم بالاحفظ عن طريق كلمة commit واذا حدث خطء تتراجع عن الحفظ من خلال كلمة rollback وسطر الاخر يرجع رسالة خطء الي البرنامج وهو  raiserror('عفوا حدث خطأ الرجاء اعادة المحاولة',14,1)

CREATE PROCEDURE dbo.spAdd
	@val1 int,
	@val2 nvarchar(50),
	
	@valA  nvarchar(50),
	@valB nvarchar(50),
	@valC int
AS
Begin 
Begin Transaction
	insert into dbo.Table_1 (Col1,col2) values (@val1,@val2)
	insert into dbo.Table_2  values (@@identity,@valA,@valB,@valC)
if @@ERROR = 0
	commit
else
begin
	raiserror('عفوا حدث خطأ الرجاء اعادة المحاولة',14,1)
	rollback
end
end

والكود البياقي في البرنامج وهو ارسال كلا قيم الجدولين الي الstored procedure وهذ هو الكود

dim con as new SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString1").ConnectionString)
 
        try
         con.Open()
        SqlCommand com = new SqlCommand("dbo.spAdd", con)
        com.CommandType = CommandType.StoredProcedure
        com.Parameters.Add("val1", SqlDbType.Int).Value = val1.ToString()
        com.Parameters.Add("val2", SqlDbType.NVarChar, 50).Value = val2.ToString()
       
        com.Parameters.Add("valA", SqlDbType.NVarChar, 50).Value = valA.ToString()
        com.Parameters.Add("valB", SqlDbType.NVarChar, 50).Value = valB.ToString()
        com.Parameters.Add("valC", SqlDbType.Int).Value = valC.ToString()
       
	com.ExecuteNonQuery ()
        
        catch (Exception ex)        
         MessageBox.show(ex.Message)        
  finally       
            con.Close()
        end try
#7

ولا يهمك يا أخ كريم

ومنكم نستفيد  :)

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#8

أساتذتي الأخ كريم والأخ محمد

 

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

كم نستفيد منكم

جعله فيه ميزان حسناتكم

:)  :)  :)  شكرا لكل من علمني حرفا :)  :)  :)


#9

الأستاذ محمد والأستاذ كريم 

جزاكما الله خيراً ... كفيتما ووفيتما

 

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

وهذا الكود الذي استخدمته في زر الحفظ : 

 

Try
            If TextBox1.Text = "" Then
                TextBox1.Text = ds.Tables("StudentsInfo").Compute("Max(Id)", "ID >= 0") + "1"


                Dim strSQL1 As String = "INSERT INTO StudentsInfo (ID, StudentName) VALUES('" & Me.TextBox1.Text & "','" & Me.TextBox2.Text & "')"

                Dim cmd As SqlCommand = New SqlCommand(strSQL1, con)
                con.Open()
                cmd.ExecuteNonQuery()
                con.Close()

                For Each row As DataGridViewRow In Me.DataGridView2.Rows
                    If row.Cells(Me.DataGridView2.Columns(2).Index).Value = "" Then Exit For

                    Dim strSQL As String = "INSERT INTO StudentCourses (SID, CourseName) VALUES('" & Val(Me.TextBox1.Text) & "','" & row.Cells(Me.DataGridView2.Columns(2).Index).Value & "')"

                    Dim cmd2 As SqlCommand = New SqlCommand(strSQL, con)

                    cmd2 = New SqlCommand(strSQL, con)
                    con.Open()
                    cmd2.ExecuteNonQuery()
                    con.Close()
                Next row

            Else
                sda.EndEdit()
                SQLDataAdapter1.Update(ds, "StudentsInfo")
                cda.EndEdit()
                SQLDataAdapter2.Update(ds, "StudentCourses")

            End If

            'لأخذ موضع السجل وتخزينه للعودة إليه
            Dim intIndex As Integer
            intIndex = BindingContext(sda).Position
            'تحديث الداتاسيت لتظهر المحفوظات
            ds.Clear()
            SQLDataAdapter1.Fill(ds, "StudentsInfo")
            SQLDataAdapter2.Fill(ds, "StudentCourses")
            'cda = New BindingSource(sqldataset2, "StudentCourses")
            BindingContext(sda).Position = intIndex


            MessageBox.Show("تم حفظ التغييرات", Text, MessageBoxButtons.OK, MessageBoxIcon.Information)

        Catch ex As Exception
            MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

 

 

وبالنسبة لجملة الترانسكشن - فلم أقم بتجربتها أو معرفتها سابقاً - وكما فهمت من كلام الأستاذ كريم أنها مفيدة جداً خصوصاً في عمل الشبكات في حالة حدوث خطأ لا يحفظ أي شيء ... ويعود للحالة الطبيعية  ...  أعجبتني الفكرة وفائدتها ..

وكما فهمت من الكلام أنها تحتوي على ثلاثة معاملات وعندما كتبت - كما ذكر الأستاذ كريم

 

Begin Begin Transaction

 

لم يتعرف عليها البرنامج فقمت بعمل متغير في بداية الكود 

 

        Dim trans As SqlTransaction = con.BeginTransaction

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

 

هل يمكنك أستاذ كريم أن تضع كود الحفظ أعلاه في جملة الترانسكشن 

 

جزاكم الله خيراً ...

 

مرفق ملف مثال للمشروع ...

 

rohiem.zip

#10

هل من مساعد في تطبيث جملة Transaction  على المثال أعلاه

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