تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
خطأ Data type mismatch in criteria expression
#1
السلام عليكم ورحمة الله و بركاته 
عندى مشكبة فى الكود التالي
كود :
Dim id_emp As String
           id_emp = txt_id.Text

           Dim str_edit As String
           str_edit = "update TBL_EMP set name_emp=@name_emp, id_expire_emp=@id_expire_emp, id_copy_emp=@id_copy_emp,  lisans_emp=@lisans_emp," & vbCrLf &
                      "lisans_expire_emp=@lisans_expire_emp, passport_id_emp=@passport_id_emp, passport_expire_emp=@passport_expire_emp," & vbCrLf &
                      "birth_emp=@birth_emp, national_emp=@national_emp, job_emp=@job_emp, state_emp=@state_emp, state_date_emp=@state_date_emp," & vbCrLf &
                      "id_co=@id_co, name_co=@name_co, start_work_emp=@start_work_emp, passport_num_emp=@passport_num_emp, file_num_emp=@file_num_emp," & vbCrLf &
                      "dorg_num_emp=@dorg_num_emp, active_emp=@active_emp where id_emp = " & id_emp
           cmd = New OleDbCommand(str_edit, con)
           cmd.Parameters.Add(New OleDbParameter("@name_emp", OleDbType.VarChar)).Value = txt_name.Text
           cmd.Parameters.Add(New OleDbParameter("@id_expire_emp", OleDbType.Date)).Value = dtp_id_expire.Value.ToString("yyyy/MM/dd")
           cmd.Parameters.Add(New OleDbParameter("@id_copy_emp", OleDbType.VarChar)).Value = txt_id_copy.Text
           cmd.Parameters.Add(New OleDbParameter("@lisans_emp", OleDbType.Boolean)).Value = chb_lisans.Checked
           cmd.Parameters.Add(New OleDbParameter("@lisans_expire_emp", OleDbType.Date)).Value = dtp_lisans_expire.Value.ToString("yyyy/MM/dd")
           cmd.Parameters.Add(New OleDbParameter("@passport_id_emp", OleDbType.VarChar)).Value = txt_passport_id.Text
           cmd.Parameters.Add(New OleDbParameter("@passport_expire_emp", OleDbType.Date)).Value = dtp_passport_expire.Value.ToString("yyyy/MM/dd")
           cmd.Parameters.Add(New OleDbParameter("@birth_emp", OleDbType.Date)).Value = dtp_birth.Value.ToString("yyyy/MM/dd")
           cmd.Parameters.Add(New OleDbParameter("@national_emp", OleDbType.VarChar)).Value = cob_national.Text
           cmd.Parameters.Add(New OleDbParameter("@job_emp", OleDbType.VarChar)).Value = cob_job.Text
           cmd.Parameters.Add(New OleDbParameter("@state_emp", OleDbType.VarChar)).Value = state_emp
           cmd.Parameters.Add(New OleDbParameter("@state_date_emp", OleDbType.Date)).Value = dtp_state.Value.ToString("yyyy/MM/dd")
           cmd.Parameters.Add(New OleDbParameter("@id_co", OleDbType.Integer)).Value = txt_id_co.Text
           cmd.Parameters.Add(New OleDbParameter("@name_co", OleDbType.VarChar)).Value = cob_name_co.Text
           cmd.Parameters.Add(New OleDbParameter("@start_work_emp", OleDbType.Date)).Value = dtp_start_work.Value.ToString("yyyy/MM/dd")
           cmd.Parameters.Add(New OleDbParameter("@passport_num_emp", OleDbType.VarChar)).Value = txt_passport_num.Text
           cmd.Parameters.Add(New OleDbParameter("@file_num_emp", OleDbType.VarChar)).Value = txt_file_num.Text
           cmd.Parameters.Add(New OleDbParameter("@dorg_num_emp", OleDbType.VarChar)).Value = txt_dorg_num.Text
           cmd.Parameters.Add(New OleDbParameter("@active_emp", OleDbType.Boolean)).Value = chb_active.Checked

           con.Open()
           cmd.ExecuteNonQuery()
           con.Close()

بيظهر رساله خطا Data type mismatch in criteria expression. 


مع العلم ان كود insert  صحيح لنفس الجدول و مستخدم نفس البراميترات
الرد
تم الشكر بواسطة:
#2
جربهم عامود عامود لترى الخطأ في اي عامود

قم بعمل UPDATE على حقل واحد لترى الخطأ اين
الرد
تم الشكر بواسطة: khaled Mohammed
#3
(21-09-20, 04:45 PM)Anas Mahmoud كتب : جربهم عامود عامود لترى الخطأ في اي عامود

قم بعمل UPDATE على حقل واحد لترى الخطأ اين

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


الملفات المرفقة صورة/صور
   
الرد
تم الشكر بواسطة:
#4
طيب جرب AddWithValue ودعه يحدد لك نوع البيانات المناسب في الكل

( اعلم انها ليست الطريقة الاكثر كفائة ولكنها ستعمل ان شاء الله )

كود :
       cmd.Parameters.AddWithValue("@passport_expire_emp", dtp_passport_expire.Value)

ايضا اظن انه من الخطأ ان تقوم بتحويل التاريخ لقيمة String يجب ان تمرر التاريخ كما هو Date
الرد
تم الشكر بواسطة:
#5
(21-09-20, 05:13 PM)Anas Mahmoud كتب : طيب جرب AddWithValue ودعه يحدد لك نوع البيانات المناسب في الكل

( اعلم انها ليست الطريقة الاكثر كفائة ولكنها ستعمل ان شاء الله )

كود :
       cmd.Parameters.AddWithValue("@passport_expire_emp", dtp_passport_expire.Value)

ايضا اظن انه من الخطأ ان تقوم بتحويل التاريخ لقيمة String يجب ان تمرر التاريخ كما هو Date

 استاذنا الغالي 
جربت ADDWITHVALUE لكن نفس الخطأ 
جربت التاريخ بدون tostring لكن نفس الخطا 

لكن جربت string.format اشتغل الكود 
كود :
       Dim str_edit As String
       str_edit = String.Format("update TBL_EMP set name_emp='{0}', id_expire_emp=#{1}#, id_copy_emp='{2}', lisans_emp={3}, lisans_expire_emp =#{4}#, passport_id_emp='{5}', passport_expire_emp=#{6}#, birth_emp=#{7}#, national_emp='{8}', job_emp='{9}', state_emp='{10}', state_date_emp=#{11}#, id_co={12}, name_co='{13}', start_work_emp=#{14}#, passport_num_emp='{15}', file_num_emp='{16}', dorg_num_emp='{17}', active_emp={18} where id_emp ='{19}' ", txt_name.Text, dtp_id_expire.Value.ToString("yyyy/MM/dd"), txt_id_copy.Text, chb_lisans.Checked, dtp_lisans_expire.Value.ToString("yyyy/MM/dd"), txt_passport_id.Text, dtp_passport_expire.Value.ToString("yyyy/MM/dd"), dtp_birth.Value.ToString("yyyy/MM/dd"), cob_national.Text, cob_job.Text, state_emp, dtp_state.Value.ToString("yyyy/MM/dd"), txt_id_co.Text, cob_name_co.Text, dtp_start_work.Value.ToString("yyyy/MM/dd"), txt_passport_num.Text, txt_file_num.Text, txt_dorg_num.Text, chb_active.Checked, id_emp)
       cmd = New OleDbCommand(str_edit, con)

(21-09-20, 05:13 PM)Anas Mahmoud كتب : طيب جرب AddWithValue ودعه يحدد لك نوع البيانات المناسب في الكل

( اعلم انها ليست الطريقة الاكثر كفائة ولكنها ستعمل ان شاء الله )

كود :
       cmd.Parameters.AddWithValue("@passport_expire_emp", dtp_passport_expire.Value)

ايضا اظن انه من الخطأ ان تقوم بتحويل التاريخ لقيمة String يجب ان تمرر التاريخ كما هو Date

لكن لماذا لم يعمل مع البراميترات و عمل مع string.format لا اعرف
الرد
تم الشكر بواسطة:
#6
للاسف البرنامج غير محمي الان من ال SQL injection

استخدام البراميترات ليس خيارا رفاهيا ،

جرب الى ان تصل الى الحل وارسل مثال به قاعدة البيانات فارغة ربما اجرب معك

اتضح ان المشكلة في الجزء الخاص بالشرط where id_emp = " & id_emp

اجعله بارمتر ايضا وجرب ان شاء الله تظبط


كود :
where id_emp = @id_emp

ثم مرره على هيئة integer

كود :
Dim id_emp As Integer = Integer.Parse(txt_id.Text)
cmd.Parameters.AddWithValue("@id_emp", id_emp)

https://stackoverflow.com/a/28155776/14137871
الرد
تم الشكر بواسطة:
#7
(21-09-20, 07:06 PM)Anas Mahmoud كتب : للاسف البرنامج غير محمي الان من ال SQL injection

استخدام البراميترات ليس خيارا رفاهيا ،

جرب الى ان تصل الى الحل وارسل مثال به قاعدة البيانات فارغة ربما اجرب معك

اتضح ان المشكلة في الجزء الخاص بالشرط where id_emp = " & id_emp

اجعله بارمتر ايضا وجرب ان شاء الله تظبط


كود :
where id_emp = @id_emp

ثم مرره على هيئة integer

كود :
Dim id_emp As Integer = Integer.Parse(txt_id.Text)
cmd.Parameters.AddWithValue("@id_emp", id_emp)

https://stackoverflow.com/a/28155776/14137871

معني ذلك ان استخدام string.format ليس صحيا للبرنامج ؟

النقطه الثانية عمود id_emp فى الجدول انا عملته من نوع short text  لان الارقام المدخله فيه كبيرة 10 ارقام . هل استخدام double افضل ام اتركه كما هو 

بخصوص جعل المتغير id_emp من نوع integer هل لا يمثل تعارض و العمود الخاص به فى الجدول من نوع short text ؟
الرد
تم الشكر بواسطة:
#8
نعم استخدام string.format لبناء الاستعلامات ليس امنا 


طيب طالما مش رقم خليه String زي ما هو بس استخدم Parameters

ومن الاول طالما كان نص يبقى كان لازم تحطه بين علامتين ' ' دي كان المشكلة من الاول


كود :
where id_emp ='" & id_emp & "'"

بس برده استخدم بارامترز احسن
الرد
تم الشكر بواسطة: khaled Mohammed , khaled Mohammed
#9
مشكور استاذ انس
بارك الله فيك و اسعد قلبك
الرد
تم الشكر بواسطة: Anas Mahmoud , Anas Mahmoud



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


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