منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : خطأ في عملية حفظ محتوى datagridview إلى جدول من قاعدة البيانات
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته أعضاء المنتدى
لدي جدول يحتوي على خمسة حقول
الرقم : مفتاح : القيمة نص 
الإسم واللقب : نص
رقم الحساب : رقم
مفتاح : رقم
المبلغ : رقم

عند تنفيذ الكود التالي
كود :
For Each row As DataGridViewRow In DGView.Rows
           Using cmd As New OleDbCommand("INSERT INTO Emp (nom,NCompte,Cle,MontApayer) VALUES(@Nom, @Compte,  @Cle, @Montant)", cn)
               cmd.Parameters.AddWithValue("@Nom", row.Cells("Nom").Value)
               cmd.Parameters.AddWithValue("@Compte", row.Cells("Compte").Value)
               cmd.Parameters.AddWithValue("@Cle", row.Cells("Cle").Value)
               cmd.Parameters.AddWithValue("@Montant", row.Cells("Montant").Value)
               cn.Open()
               cmd.ExecuteNonQuery()
               cn.Close()
           End Using
       Next

بضهر الخطأ التالي
لا يمكن أن يحتوي الفهرس أو المفتاح الأساسي على قيمة خالية (Null).
فكيف يمكن معالجة هذا الخطأ بارك الله فيكم
وعليكم السلام ورحمة الله وبركاته

الرقم : مفتاح : القيمة نص
اجعله ترقيم تلقائي ( AutoNumber )


تحياتى لك
وتمنياتى لك التوفيق
السلام عليكم ورحمة الله وبركاته 
شكرا لك أخي elgokr على الرد
فعلا أخي عند جعل خاصية الرقم ترقيم تلقائي ( AutoNumber )
تمت عملية الحفظ ولكن بضهور خطأ ثاني 
لا توجد للمعلمة @Nom قيمة افتراضية.
مع العلم أنني لا أريد للرقم أن يكون AutoNumber 
وبارك الله فيكم 

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

كود :
Private Sub NemID()
       Dim N As Integer
       cn.Open()
       cmd.CommandText =
       <sql>
                   SELECT
                       Nem                    
                   FROM
                       Emp;
               </sql>.Value
       Dtr = cmd.ExecuteReader
       While Dtr.Read
           N = Dtr(0)
       End While
       N += 1
       TextBoxNem.Text = N.ToString("000000")
       cn.Close()
   End Sub
    
    Private Sub ButtonAjouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAjouter.Click
       cn.Open()
       cmd.CommandText = "SELECT COUNT (*) FROM Emp WHERE Nem='" & TextBoxNem.Text & "'"
       Dim Cpt As Int16
       Cpt = cmd.ExecuteScalar
       If Cpt = 0 Then
           cmd.CommandText = "INSERT INTO Emp(Nem,nom,NCompte,Cle,MontApayer,Motif)VALUES ('" & TextBoxNem.Text & "','" & TextBoxNomPren.Text & "','" & TextBoxNCcp.Text & "','" & TextBoxCle.Text & "','" & TextBoxMontant.Text & "','" & ComboBoxMotif.Text & "')"
           cmd.ExecuteNonQuery()
           MessageBox.Show("تمت عملية الحفظ بنجاح")
       Else
           MessageBox.Show("هذا الإسم موجود مسبقا")
       End If
       cn.Close()
       ShowdDataGView()
   End Sub
السبب يرجع الى القيمة هنا
كود :
row.Cells("Nom").Value

تاكد بان Nom اذا كان رقم ولا يقبل ان يكون فارغ
ان يكون القيمة هنا 
كود :
row.Cells("Nom").Value

هو رقم صحيح وكذلك ليس فارغ

يمكنك عمل زر للاختبار وتضع به هذا الكود
كود :
       For Each row As DataGridViewRow In DGView.Rows
           MsgBox(row.Cells("Nom").Value)
       Next
وتقوم بتعبئة الداتا جريد
وبدلاً من عمل الحفظ تقوم بالضغط على هذا الزر
وتري فى كل مرة يظهر رسالة هل تحتوى على اى منهم رسالة فارغة

واذا كان الاجابة نعم وهى تخص الرسالة الاخيرة مثلاً

فكل ما عليك ان تقوم باستبدال كود الحفظ بهذا الكود
كود :
       For Each row As DataGridViewRow In DGView.Rows
           If row.Cells("Nom").Value IsNot Nothing Then
               Using Then cmd As New OleDbCommand("INSERT INTO Emp (nom,NCompte,Cle,MontApayer) VALUES(@Nom, @Compte,  @Cle, @Montant)", cn)
               cmd.Parameters.AddWithValue("@Nom", row.Cells("Nom").Value)
                   cmd.Parameters.AddWithValue("@Compte", row.Cells("Compte").Value)
                   cmd.Parameters.AddWithValue("@Cle", row.Cells("Cle").Value)
                   cmd.Parameters.AddWithValue("@Montant", row.Cells("Montant").Value)
                   cn.Open()
                   cmd.ExecuteNonQuery()
                   cn.Close()
               End Using
           End If
       Next

أو تطبيق هذا الاعدادات فى الداتا جريد
وهو تعطيل الاضافة بعدم تنشيط Enable Adding


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

ولكن عند العرض او الاستخدام يمكنك انشاء عمود اخر وليكن كود
وهو من نوع رقم

وعند الاضافة تقوم انت بادراج الرقم يدوياً مثل الاسم وباقي البيانات

تحياتى لك
وتمنياتى لك التوفيق
بارك الله فيك أخي elgokr  
جزاك الله خيرا
لى ولك وللجميع بامر الله

تحياتى لك
وتمنياتى لك التوفيق