خطأ Data type mismatch in criteria expression - khaled Mohammed - 21-09-20
السلام عليكم ورحمة الله و بركاته
عندى مشكبة فى الكود التالي
كود :
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 صحيح لنفس الجدول و مستخدم نفس البراميترات
RE: سؤال ؟ - Anas Mahmoud - 21-09-20
جربهم عامود عامود لترى الخطأ في اي عامود
قم بعمل UPDATE على حقل واحد لترى الخطأ اين
RE: سؤال ؟ - khaled Mohammed - 21-09-20
(21-09-20, 04:45 PM)Anas Mahmoud كتب : جربهم عامود عامود لترى الخطأ في اي عامود
قم بعمل UPDATE على حقل واحد لترى الخطأ اين
جربت عمود عمود لكن يظهر نفس المشكله فى الكل
RE: سؤال ؟ - Anas Mahmoud - 21-09-20
طيب جرب AddWithValue ودعه يحدد لك نوع البيانات المناسب في الكل
( اعلم انها ليست الطريقة الاكثر كفائة ولكنها ستعمل ان شاء الله )
كود :
cmd.Parameters.AddWithValue("@passport_expire_emp", dtp_passport_expire.Value)
ايضا اظن انه من الخطأ ان تقوم بتحويل التاريخ لقيمة String يجب ان تمرر التاريخ كما هو Date
RE: سؤال ؟ - khaled Mohammed - 21-09-20
(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 لا اعرف
RE: سؤال ؟ - Anas Mahmoud - 21-09-20
للاسف البرنامج غير محمي الان من ال 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
RE: سؤال ؟ - khaled Mohammed - 21-09-20
(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 ؟
RE: سؤال ؟ - Anas Mahmoud - 21-09-20
نعم استخدام string.format لبناء الاستعلامات ليس امنا
طيب طالما مش رقم خليه String زي ما هو بس استخدم Parameters
ومن الاول طالما كان نص يبقى كان لازم تحطه بين علامتين ' ' دي كان المشكلة من الاول
كود :
where id_emp ='" & id_emp & "'"
بس برده استخدم بارامترز احسن
RE: سؤال ؟ - khaled Mohammed - 21-09-20
مشكور استاذ انس
بارك الله فيك و اسعد قلبك
|