منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
[VB.NET] مشكلة عند تحزيم البرنامج - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183)
+--- الموضوع : [VB.NET] مشكلة عند تحزيم البرنامج (/showthread.php?tid=50062)



مشكلة عند تحزيم البرنامج - annagui - 13-08-24

السلام عليكم ورحمة الله وبركاته . اساتذتي الكرام  بفضل الله و عونكم اتممت مشروعي شغال 100%  لاكن عند التحزيم  ظهرت معي مشكلتين مع العلم اني اتعامل مع قاعدة بيانات من نوع (mdb) 
الاولى عند الظغط على زر تعديل البيانات تظهر معي هذه الرسالة : (operation must use an updateable query) 
وهذا كود التعديل 
كود :
زر التعديل
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Try

           conn.Open()
           Dim table As New DataTable("annagui")
           Dim rs As New OleDb.OleDbDataAdapter("update annagui SET nom ='" & TextBox2.Text & "',prenom ='" & TextBox3.Text & "',date_de_naissance ='" & DateTimePicker1.Value.ToString("dd/MM/yyyy") & "',lieu_de_naissance ='" & TextBox4.Text & "',sex ='" & ComboBox1.Text & "',numero_passport ='" & TextBox5.Text & "',date_validation ='" & DateTimePicker2.Value.ToString("dd/MM/yyyy") & "',date_expired ='" & DateTimePicker3.Value.ToString("dd/MM/yyyy") & "',age ='" & TextBox6.Text & "',cin ='" & ComboBox2.Text & "',numero_cin ='" & TextBox7.Text & "',autre_nationalite ='" & ComboBox3.Text & "',nom_pere ='" & TextBox8.Text & "',nom_grand_pere ='" & TextBox9.Text & "',nom_mere ='" & TextBox10.Text & "',prenom_mere ='" & TextBox11.Text & "',profession ='" & TextBox12.Text & "',qualite ='" & ComboBox4.Text & "',email ='" & TextBox13.Text & "',adresse_uae ='" & ComboBox5.Text & "',tel_uae ='" & TextBox14.Text & "',etat_civil ='" & ComboBox6.Text & "',nom_epou ='" & TextBox15.Text & "',prenom_epou ='" & TextBox16.Text & "',validation ='" & DateTimePicker4.Value.ToString("dd/MM/yyyy") & "',expired ='" & DateTimePicker5.Value.ToString("dd/MM/yyyy") & "',remarque ='" & TextBox17.Text & "',r_sex ='" & TextBox18.Text & "',r_etat ='" & TextBox19.Text & "' Where id=" & TextBox1.Text & ";  ", conn)
           rs.Fill(table)
           rs.Dispose()
           MsgBox("تم تحديث البيانات بنجاح   ", vbInformation, "تحديث")
           conn.Close()

           Form2.load_data()

       Catch ex As Exception
           MessageBox.Show(ex.Message)
       End Try

   End Sub



RE: مشكلة عند تحزيم البرنامج - salamandal - 14-08-24

(13-08-24, 11:40 PM)annagui كتب : السلام عليكم ورحمة الله وبركاته . اساتذتي الكرام  بفضل الله و عونكم اتممت مشروعي شغال 100%  لاكن عند التحزيم  ظهرت معي مشكلتين مع العلم اني اتعامل مع قاعدة بيانات من نوع (mdb) 
الاولى عند الظغط على زر تعديل البيانات تظهر معي هذه الرسالة : (operation must use an updateable query) 
وهذا كود التعديل 
كود :
زر التعديل
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Try

           conn.Open()
           Dim table As New DataTable("annagui")
           Dim rs As New OleDb.OleDbDataAdapter("update annagui SET nom ='" & TextBox2.Text & "',prenom ='" & TextBox3.Text & "',date_de_naissance ='" & DateTimePicker1.Value.ToString("dd/MM/yyyy") & "',lieu_de_naissance ='" & TextBox4.Text & "',sex ='" & ComboBox1.Text & "',numero_passport ='" & TextBox5.Text & "',date_validation ='" & DateTimePicker2.Value.ToString("dd/MM/yyyy") & "',date_expired ='" & DateTimePicker3.Value.ToString("dd/MM/yyyy") & "',age ='" & TextBox6.Text & "',cin ='" & ComboBox2.Text & "',numero_cin ='" & TextBox7.Text & "',autre_nationalite ='" & ComboBox3.Text & "',nom_pere ='" & TextBox8.Text & "',nom_grand_pere ='" & TextBox9.Text & "',nom_mere ='" & TextBox10.Text & "',prenom_mere ='" & TextBox11.Text & "',profession ='" & TextBox12.Text & "',qualite ='" & ComboBox4.Text & "',email ='" & TextBox13.Text & "',adresse_uae ='" & ComboBox5.Text & "',tel_uae ='" & TextBox14.Text & "',etat_civil ='" & ComboBox6.Text & "',nom_epou ='" & TextBox15.Text & "',prenom_epou ='" & TextBox16.Text & "',validation ='" & DateTimePicker4.Value.ToString("dd/MM/yyyy") & "',expired ='" & DateTimePicker5.Value.ToString("dd/MM/yyyy") & "',remarque ='" & TextBox17.Text & "',r_sex ='" & TextBox18.Text & "',r_etat ='" & TextBox19.Text & "' Where id=" & TextBox1.Text & ";  ", conn)
           rs.Fill(table)
           rs.Dispose()
           MsgBox("تم تحديث البيانات بنجاح   ", vbInformation, "تحديث")
           conn.Close()

           Form2.load_data()

       Catch ex As Exception
           MessageBox.Show(ex.Message)
       End Try

   End Sub

في الاستعلامات التي نقوم بها على الجداول نستخدم التعليمة Update لتحديث السجلات وهي ليست مخصصة للقراءة اي انها لا تعود بأي سجلات ExecuteNonQuery
على النقيض من اختها التعليمة Select فهي مخصصة للقراءة وتعود بسجلات ExecuteReader
و كبداية ارى ان الخطأ ربما يكون في السطرين التاليين (لانه لا حاجة لاستخدام DataTable
كود :
Dim table As New DataTable("annagui")
rs.Fill(table)
'اضافة سطر جديد لتنفيذ الاستعلام
rs.ExecuteNonQuery()
تخلص من هذين السطرين وانظر ماذا ترى

نصيحة : لا تستخدم التعليمة Try عند مرحلة تجريب الكود حتى تتمكن من تحديد مناطق الخطأ في الكود


RE: مشكلة عند تحزيم البرنامج - الـ ـجارح - 15-08-24

الخطأ الذي تواجهه "operation must use an updateable query" يشير عادة إلى أن الاستعلام المستخدم للتحديث غير قابل للتعديل. هناك عدة أسباب محتملة لهذا:

قد يكون الاتصال بقاعدة البيانات مفتوحًا بوضع القراءة فقط.
قد تكون هناك مشكلة في صياغة استعلام التحديث.
قد تكون هناك مشكلة في الصلاحيات على قاعدة البيانات.

لنحاول تحسين الكود لحل هذه المشكلة:

أولاً، دعنا نستخدم باراميترات في الاستعلام لتجنب مشاكل الأمان وتحسين الأداء:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Using conn As New OleDb.OleDbConnection(connectionString)
conn.Open()
Dim sql As String = "UPDATE annagui SET nom = ?, prenom = ?, date_de_naissance = ?, " & _
"lieu_de_naissance = ?, sex = ?, numero_passport = ?, " & _
"date_validation = ?, date_expired = ?, age = ?, cin = ?, " & _
"numero_cin = ?, autre_nationalite = ?, nom_pere = ?, " & _
"nom_grand_pere = ?, nom_mere = ?, prenom_mere = ?, " & _
"profession = ?, qualite = ?, email = ?, adresse_uae = ?, " & _
"tel_uae = ?, etat_civil = ?, nom_epou = ?, prenom_epou = ?, " & _
"validation = ?, expired = ?, remarque = ?, r_sex = ?, r_etat = ? " & _
"WHERE id = ?"

Using cmd As New OleDb.OleDbCommand(sql, conn)
cmd.Parameters.AddWithValue("@nom", TextBox2.Text)
cmd.Parameters.AddWithValue("@prenom", TextBox3.Text)
cmd.Parameters.AddWithValue("@date_de_naissance", DateTimePicker1.Value.ToString("dd/MM/yyyy"))
' ... أضف باقي الباراميترات هنا ...
cmd.Parameters.AddWithValue("@id", TextBox1.Text)

Dim rowsAffected As Integer = cmd.ExecuteNonQuery()

If rowsAffected > 0 Then
MsgBox("تم تحديث البيانات بنجاح", vbInformation, "تحديث")
Form2.load_data()
Else
MsgBox("لم يتم تحديث أي سجل. تأكد من صحة معرف السجل.", vbInformation, "تحديث")
End If
End Using
End Using
Catch ex As Exception
MessageBox.Show("حدث خطأ أثناء تحديث البيانات: " & ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub


هذا الكود يستخدم الأسلوب الموصى به للتعامل مع قواعد البيانات

يستخدم Using للتأكد من إغلاق الاتصال بشكل صحيح.
يستخدم باراميترات لمنع هجمات SQL Injection وتحسين الأداء.
يستخدم ExecuteNonQuery بدلاً من OleDbDataAdapter لأن هذه العملية هي تحديث وليس استعلامًا.

إذا استمرت المشكلة بعد هذه التغييرات، فقد تكون هناك مشكلة في الاتصال بقاعدة البيانات نفسها. تأكد من أن:

لديك الصلاحيات الكافية للكتابة في قاعدة البيانات.
ملف قاعدة البيانات ليس محميًا ضد الكتابة.
سلسلة الاتصال (connection string) صحيحة وتسمح بالكتابة.


RE: مشكلة عند تحزيم البرنامج - salamandal - 15-08-24

مشكور الاخ الجارح
وهذه المشاركة لعرض الكود السابق بشكل اوضح

كود :
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Using conn As New OleDb.OleDbConnection(connectionString)
conn.Open()
Dim sql As String = "UPDATE annagui SET nom = ?, prenom = ?, date_de_naissance = ?, " & _
"lieu_de_naissance = ?, sex = ?, numero_passport = ?, " & _
"date_validation = ?, date_expired = ?, age = ?, cin = ?, " & _
"numero_cin = ?, autre_nationalite = ?, nom_pere = ?, " & _
"nom_grand_pere = ?, nom_mere = ?, prenom_mere = ?, " & _
"profession = ?, qualite = ?, email = ?, adresse_uae = ?, " & _
"tel_uae = ?, etat_civil = ?, nom_epou = ?, prenom_epou = ?, " & _
"validation = ?, expired = ?, remarque = ?, r_sex = ?, r_etat = ? " & _
"WHERE id = ?"

Using cmd As New OleDb.OleDbCommand(sql, conn)
cmd.Parameters.AddWithValue("@nom", TextBox2.Text)
cmd.Parameters.AddWithValue("@prenom", TextBox3.Text)
cmd.Parameters.AddWithValue("@date_de_naissance", DateTimePicker1.Value.ToString("dd/MM/yyyy"))
' ... أضف باقي الباراميترات هنا ...
cmd.Parameters.AddWithValue("@id", TextBox1.Text)

Dim rowsAffected As Integer = cmd.ExecuteNonQuery()

If rowsAffected > 0 Then
MsgBox("تم تحديث البيانات بنجاح", vbInformation, "تحديث")
Form2.load_data()
Else
MsgBox("لم يتم تحديث أي سجل. تأكد من صحة معرف السجل.", vbInformation, "تحديث")
End If
End Using
End Using
Catch ex As Exception
MessageBox.Show("حدث خطأ أثناء تحديث البيانات: " & ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub