تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مشكلة في تعديل سجل في قاعدة بيانات اكسيس
#1
عندي مشكلة في تعديل سجل في قاعدة بيانات اكسيس مع استخدام نفس الكود على قاعدة بيانات Sql Server يقوم بالضافة و التعديل دون مشاكل اما في قاعدة البينات 

اكسيس يضيف سجل جديد دون اي مشكلة لكن عند التعديل لا يقوم بالتعديل يظل السجل كما هو دون ان يعطي اي رسالة خطأ او اي مشكل فقط يظل السجل كما هو لا 

يقوم بالتعديل على السجل .

المثال بالمرفقات عبارة عن اضافة و تعديل على الداتا غريد فيو .


الملفات المرفقة
.zip   ProjectToAddEditRecordDataGridView.zip (الحجم : 985.28 ك ب / التحميلات : 20)
الرد
#2
تفضل التعديل بالمرفق مع بعض اللمسات السريعة على الملف


الملفات المرفقة
.zip   ProjectToAddEditRecordDataGridView.zip (الحجم : 497.93 ك ب / التحميلات : 10)
الرد
#3
عندي سؤال أين كانت المشكلة بالضبط لاني فحصت الاستعلام المتولد و كان صحيح و فحصت الباراميترات و كانت صحيحة و لم اعرف لماذا لم يكن ينفذ الحفظ .
الرد
تم الشكر بواسطة: kiki , حريف برمجة , ابراهيم ايبو
#4
حتى توضح لك الامر اكثر اين تقع المشكلة
افتح المشروع الخاص بك ببداية الموضوع
وتعال عن عمود الملاحظات وضع رقم الصف والمقصود بها الـ ID
يعنى فى البيانات الاول ضع رقم 1 وتعال على صف الـ Test واكتب رقم 2
وستوضح لك الخطاء فين بضبط

الامر هو ان عملية Where id=noteX وليس id=id
لهذا كلما ادخلت بيانات يكون كود التعديل عبارة عن id="" أو نص
الرد
#5
لقد عملت لوب لاستخلاص الباراميترات و القيم الخاصة بها و وضعت الاستعلام في مسج بوكس مع البراميترات في المثال قبل تعديلك انظر الى الصور :

   

انظر الى المسج بوكس :

   

هذه الصور من المثال قبل التعديل هذا ماجعلني اسال عن سبب عدم الحفظ .
الرد
#6
تعال كده عند NoteX الخاص بـ Asem واكتب به رقم 1
ستشاهد ماذا سيحدث معك او بالصف الذى ياليه واكتب رقم 2

السبب سيكون كالتالى ما لاحظته مسبقاً بملفك على السريع
وهو وجود عمود ID فى الاضافة والتعديل حيث القيمة يتم تحريرها فى الاضافة والتعديل
طبعاً عند فى الملف لديك هذا العمود لا يمكن التعديل عليه من قبل المستخدم
ولكن فى الكود يقوم باخذ قيمته وتحريره بقاعدة البيانات
بحيث عند الاضافة بيكون الادخال فارغ فهنا ياتى دور الترقيم التلقائي فلا يحدث مشكلة عند الاضافة
ولكن عند التعديل ياتى دور بان الـ ID قيمته كذا فى التحرير عند الجزء SET  ومن ثم ياتي دورها عند WHERE
واعتقد اذا تم النظر فى عملية كود For لجعله يبداء من 1 بدلاً من 0 ليتجنب ID فى الاضافة والتعديل ويكتفي تعريفة فى سطر SaveColumnValueXT
واخذ الاسم والقيمة منه كون اسم العمود كذا المدخل من قبل المستخدم كما انت فعلته فى string IDCol وترتيبه وهو ما انت قمت بفعله Int32 IDColIndex
يفضل تغيير Int32 الى Int
بكده عند عمل حلقة For ستقوم بعمل تعريف لكلقمة الاعمدة خاصة البارامترات وثم خارج الحلقة ستضع بارامتر الخاص بـ ID مستقلاً
جرب الامر مع ترتيب الاكواد وتقليله وستنجح معك

فمثلاً لديك كود مثل
كود :
                   for (int i = 0; i < ArrCol.Count; i++)
                   {
                       if (i == ArrCol.Count - 1)
                       {//MessageBox.Show(DGV_Normal.Columns[i].HeaderText);
                           if (IDCol == ArrCol[i].ToString() || DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                           {
                               continue;
                           }
                           if (DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                           {
                               //MessageBox.Show(DGV_Normal.Columns[i].Name.ToString());
                               continue;
                           }
                           SqlStr += ArrCol[i].ToString() + "=@" + ArrCol[i].ToString();
                       }
                       else
                       {
                           if (IDCol == ArrCol[i].ToString() || DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                           {
                               continue;
                           }
                           if (DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                           {
                               //MessageBox.Show(DGV_Normal.Columns[i].Name.ToString());
                               continue;
                           }

                           SqlStr += ArrCol[i].ToString() + "=@" + ArrCol[i].ToString() + ",";
                       }
                   }

يمكنه ان يكون بهذا الشكل
كود :
                   for (int i = 0; i < ArrCol.Count; i++) // 0000
                   {
                       if (IDCol == ArrCol[i].ToString() || DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                       {
                           continue;
                       }
                       if (DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                       {
                           //MessageBox.Show(DGV_Normal.Columns[i].Name.ToString());
                           continue;
                       }
                       //MessageBox.Show(ArrCol[i].ToString());
                       SqlStr += ArrCol[i].ToString() + "=@" + ArrCol[i].ToString();
                       SqlStr += (i == ArrCol.Count - 1) ? "" : ",";
                   }

وكذلك الاسطر مثل هذا
كود :
                   SqlStr += " WHERE " + IDCol + "=@" + IDCol + "" + "";

يكتفى ان يكون بهذا الشكل
كود :
                   SqlStr += " WHERE " + IDCol + "=@" + IDCol;

وايضاً اسطر التحقق
كود :
                       OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), DGV_Normal.Rows[RowIndex].Cells[i].Value == null ? "" : dgvRow.Cells[i].Value.ToString());

لا اعلم لماذا تضع شرط تحقق بهذا السطر بينماً جملة ToString تكفى بهذه الاغراض ليكون السطر بهذا الشكل
كود :
                       OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), dgvRow.Cells[i].Value.ToString());

لانه اذا كان فارغ سيكون بطبيعة الحال فارغ فانت لست بحاجة ان تقول اذا كان فارغ اجعله فارغ لان ToString هى ما تقوم بذلك
ممكن ايضاً تقول ايه وظايف كل تلك الاسطر والتحقق بهذا الكود
كود :
                   if (SqlStr.Contains("UPDATE"))
                   {
                       if (DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                       {
                           //MessageBox.Show(DGV_Normal.Columns[i].Name.ToString());
                           continue;
                       }
                       if (IdentityIncrement == true)
                       {//MessageBox.Show("@" + ArrCol[i].ToString());
                           if (IDCol == ArrCol[i].ToString())
                           {
                               OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), dgvRow.Cells[i].Value);
                               continue;
                           }
                       }
                       //MessageBox.Show(DGV_Normal.Rows[RowIndex].Cells[i].Value.ToString());
                       OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), DGV_Normal.Rows[RowIndex].Cells[i].Value == null ? "" : dgvRow.Cells[i].Value.ToString());
                   }

لان هذا الجزء لا قيمة له ووجوده مثل عدمه
كود :
                       if (IdentityIncrement == true)
                       {//MessageBox.Show("@" + ArrCol[i].ToString());
                           if (IDCol == ArrCol[i].ToString())
                           {
                               OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), dgvRow.Cells[i].Value);
                               continue;
                           }
                       }

لان السطر اللى هو
كود :
                       OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), DGV_Normal.Rows[RowIndex].Cells[i].Value == null ? "" : dgvRow.Cells[i].Value.ToString());

بعد تعديله يجب ان يكون بهذا الشكل
كود :
                       OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), dgvRow.Cells[i].Value.ToString());

هيكفي لاعطاء قيم كل البارامترات اذا كان ID أو غيرها فلا يحدث اى مشكلة
جرب تضع هذا الكود مكانه وستجد النتيجة واحدة
كود :
                   if (SqlStr.Contains("UPDATE"))
                   {
                       if (DGV_Normal.Columns[i] is DataGridViewButtonColumn)
                       {
                           //MessageBox.Show(DGV_Normal.Columns[i].Name.ToString());
                           continue;
                       }
                       //MessageBox.Show(DGV_Normal.Rows[RowIndex].Cells[i].Value.ToString());
                       OleDBCmd.Parameters.AddWithValue("@" + ArrCol[i].ToString(), dgvRow.Cells[i].Value.ToString());
                   }

بالنهاية ونصيحة مهمة جداً يجب الانتباه اليها وهو هذا السطر
كود :
if (Con.State == ConnectionState.Open)

و
كود :
               OleDBCmd.ExecuteNonQuery();

مش من الصح التحقق اذا كان الاتصال مفتوع تقوم باغلاقه ومن ثم فتحه ثم تنفيذ التحديث
الصح ان يكون كل من هذه الاسطر بهذا الشكل
كود :
               if (Con.State == ConnectionState.Closed)
                   Con.Open();
               OleDBCmd.ExecuteNonQuery();
               Con.Close();

لاحظ فتح واغلاق قبل وبعد تنفيذ مباشر لان هذا سيساعد اذا كان اكثر مش شخص يستخدم الاتصال بقاعدة بيانات الـ Access
لان سيجعل الاتصال بقاعدة البيانات دائماً مغلقة دائماً ما نلاحظ وجود ايقومة من  قاعدة البيانات بجانب الايقومة الرئيسية لملف قاعدة البيانات
وبيكون سببها هو كود الاتصال بفتح الاتصال بدون اغلاق ليبقي هذه الايقونة موجوده حتى يتم اغلاق الاتصال
اتمنى بالنهاية اكون ولو بقدر ما استطاع وضحت كل شى بخصوص الخطاء وما فى الملف لديك واسف على كثرة النقاش
الرد
تم الشكر بواسطة: حريف برمجة , asemshahen5 , ابراهيم ايبو , elgokr



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم