الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الاستعلام يعطي رسالة خطأ إذا كان الباراميتر أقل من ثلاث حروف

بدأه فيجولي في 27 مايو 2014 · 7 رد · 489 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

أرغب بالبحث في جدول بقاعدة بيانات sql واستخدمت الكود التالي في زر البحث :

  Dim constr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
            Using con As New SqlConnection(constr)
                Using cmd As New SqlCommand()
                    cmd.CommandText = "SELECT * from Departs where  DepartNumber like   '%' +@DepartNumber+ '%'  OR  DepartName like   '%' +@DepartName+ '%'  OR DepartGender like  '%' +@DepartGender+ '%'  OR DepartSection like  '%' +@DepartSection+ '%' and IsActive=@IsIsActive"
                    cmd.Parameters.AddWithValue("@DepartNumber", TxtNumber.Text)
                    cmd.Parameters.AddWithValue("@DepartName", TxtDepartName.Text)
                    cmd.Parameters.AddWithValue("@DepartGender", TxtSearchGender.Text)
                    cmd.Parameters.AddWithValue("@DepartSection", TxtSearchSection.Text)
                    cmd.Parameters.AddWithValue("@IsActive", True)

                    If [String].IsNullOrEmpty(TxtSearchMoeID.Text) = True Then
                        cmd.Parameters("@DepartMoeID").Value = DBNull.Value
                    End If

                    If [String].IsNullOrEmpty(TxtSearchName.Text) = True Then
                        cmd.Parameters("@DepartName").Value = DBNull.Value
                    End If


                    cmd.Connection = con
                    con.Open()
                    Dim dt As New DataTable
                    Dim da As New SqlDataAdapter(cmd)
                    da.Fill(dt)

                    gview.DataSourceID = Nothing
                    gview.DataSource = dt
                    gview.DataBind()

                   
                End Using
            End Using

        Catch ex As Exception
            MsgBox(ex.Message)
        
End Try

عندما يكون أي تكست بوكس فارغ فلا مشكلة في البحث حتى وإن كانت جميعها فارغة ، ولكن تظهر لي رسالة الخطأ التالية في حال كان أحد التكست بوكس يحتوي علر حرف أو حرفين :

operator '=' is not defined for type 'dbnull' and type 'boolean'

إن أدخلت ثلاث أحرف وأكثر قبل الاستعلام ، أما حرفين فلا يقبل ( إما ثلاث حروف أو فارغ ) على الرغم من أني تحققت من القيم المرسلة إن كانت null باستخدام isnullOrEmpty ولكن البرنامج يعتبر أن الحرف أو الحرفين Null أو empty ۔۔۔۔۔

 

للمعلومية ، جميع الحقول في الجدول من النوع Nvarchar

أتمنى أن أجد الإجابة لديكم ۔۔۔

#2

السلام عليكم

 

المشكلة هي بسبب عمل like  مع قيمة  Null  لذا عليك ببناء الاستعلام حسب الحقول المتوفرة مثل :

If [String].IsNullOrEmpty(TxtSearchName.Text) = True Then
cmd.CommandText =  cmd.CommandText  & " OR DepartName like   '%' +@DepartName+ '%' "
                      cmd.Parameters.AddWithValue("@DepartName", TxtDepartName.Text)
                    End If

مع حذف هذا الحقل من الاستعلام الاصلي

#3

شكرا أخي طارق على تجاوبكم

 

لا زالت المشكلة قائمة ، الحرف الواحد أو الحرفين تعتبر قيمة Null

#4

ارفع مثال بسيط للمشكلة ،، وان شاء الله نعدل عليها .

#5

لاحظت شيء غريب ، عند إدخال حرف باللغة الانجليزية لا يظهر أي خطأ و ولكن البحث باللغة العربية ( حرف أو حرفين ) يظهر خطأ و قمت بالتحقق من ال collation للحقول ووجدتها Arabic ،،،،،

 

شيء غريب فعلاً مع العلم أني استخدمت نفس الكود في مشروع قديم  ولا توجد أي مشكلة

#6
code.vip كتب:

ارفع مثال بسيط للمشكلة ،، وان شاء الله نعدل عليها .

 

 

سأقوم بوفع مثال قريباً

#7

لاحظت شئ غريب !!

 

إذا كان الحرف المراذ البحث عنه إنجليزي فلا مشكلة !! أما إذا كان عربي تظهر لي رسالة الخطأ أعلاه !!!

 

قمت بالتحقق من collation لكافة الحقول في قاعدة البيانات ووجدت أنها Arabic  ، قمت بإضافة N قبل الباراميتر في الاستعلام ولا زالت المشكلة ۔۔۔۔

 

ما رأيكم ؟

#8

تم حل المشكلة

 

الكود المستخدم :

//يجب إضافة N Clause قبل الباراميتر إذا كان الحقل من نوع NVarchar ويستقبل قيمة Unicode مع LIKE Clause
cmd.CommandText = "SELECT * from Departs where  (DepartNumber like   N'%' +@DepartNumber+ '%'  OR  DepartName like   N'%' +@DepartName+ '%'  OR DepartGender like  N'%' +@DepartGender+ '%'  OR DepartSection like  N'%' +@DepartSection+ '%') and IsActive=@IsIsActive"
cmd.Parameters.AddWithValue("@DepartNumber", TxtNumber.Text)
cmd.Parameters.AddWithValue("@DepartName", TxtDepartName.Text)
cmd.Parameters.AddWithValue("@DepartGender", TxtSearchGender.Text)
cmd.Parameters.AddWithValue("@DepartSection", TxtSearchSection.Text)
cmd.Parameters.AddWithValue("@IsActive", True)

//فحص قيمة إذا كانت القيمة NULL 
If NOT [String].IsNullOrEmpty(TxtNumber.Text) = True Then
cmd.Parameters("@DepartNumber").Value = DBNull.Value
Else
cmd.parameter("@DepartNumber").value = DBNull.value
  End If

If NOT [String].IsNullOrEmpty(TxtSearchName.Text) = True Then
cmd.Parameters("@DepartName").Value = DBNull.Value
else
cmd.parameter("@DepartName").value = DBNull.value
End If

شاكر لكم تعاونكم

تم تعديل هذه المشاركة بواسطة فيجولي في 29 مايو 2014 في 02:20

مواضيع مشابهة