سؤال

أرغب في إنشاء بعض المخرجات المنسقة للبيانات التي تم استردادها من قاعدة بيانات MS-Access وتخزينها في ملف جدول البيانات كائن/متغير، myDataTable.ومع ذلك، فإن بعض الحقول الموجودة في myDataTable cotain dbNull بيانات.لذا، فإن مقتطف كود VB.net التالي سيعطي أخطاء إذا كانت قيمة أي من الحقول اسم العائلة, بالاحرف الاولى, ، أو معرف الهوية يكون dbNull.

   dim myDataTable as DataTable
   dim tmpStr as String
   dim sID as Integer = 1

   ...
   myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table
   ...

   For Each myItem As DataRow In myDataTable.Rows

    tmpStr = nameItem("lastname") + " " + nameItem("initials")

    If myItem("sID")=sID Then
        ' Do something
    End If

    ' print tmpStr

   Next

لذا، كيف يمكنني تشغيل الكود أعلاه عندما تحتوي الحقول على dbNull دون الحاجة إلى التحقق في كل مرة مما إذا كانت البيانات dbNull كما في هذا السؤال?

هل كانت مفيدة؟

المحلول

الطريقة الوحيدة التي أعرفها هي اختبارها، ويمكنك القيام بها معًا لتسهيل الأمر.

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

لقد كتبت بلغة VB حيث يبدو أن هذا هو ما تحتاجه، على الرغم من أن اللغات مختلطة.

يحرر

تم تنظيفه لاستخدام IsDbNull لجعله أكثر قابلية للقراءة

نصائح أخرى

وحصلت تعبت من التعامل مع هذه المشكلة لذلك كتبت وظيفة NotNull () لمساعدتي.

Public Shared Function NotNull(Of T)(ByVal Value As T, ByVal DefaultValue As T) As T
        If Value Is Nothing OrElse IsDBNull(Value) Then
                Return DefaultValue
        Else
                Return Value
        End If
End Function

والاستعمال:

If NotNull(myItem("sID"), "") = sID Then
  ' Do something
End If

لقد ذهب ظيفة بلدي NotNull () من خلال زوجين من اصلاحات على مر السنين. قبل الوراثة، وأنا ببساطة تحديد كل شيء كما كائن. ولكن أنا أفضل بكثير إصدار عام.

ويمكنك أيضا استخدام Convert.ToString () وConvert.To عدد صحيح () طرق لتحويل العناصر مع DBNULL على نحو فعال.

وهناك تباين في كود ستيف Wortham في ، لاستخدامها اسميا مع أنواع nullable:

Private Shared Function GetNullable(Of T)(dataobj As Object) As T
    If Convert.IsDBNull(dataobj) Then
        Return Nothing
    Else
        Return CType(dataobj, T)
    End If
End Function

ومنها مثلا.

mynullable = GetNullable(Of Integer?)(myobj)

وبعد ذلك يمكنك الاستعلام mynullable (على سبيل المثال، mynullable.HasValue)

توصلت Microsoft إلى DBNull في .NET 1.0 لتمثيل قاعدة البيانات NULL.ومع ذلك، يعد الاستخدام صعبًا لأنه لا يمكنك إنشاء متغير مكتوب بقوة لتخزين قيمة حقيقية أو فارغة.قامت Microsoft بحل هذه المشكلة نوعًا ما في .NET 2.0 بأنواع لاغية.ومع ذلك، لا تزال عالقًا مع أجزاء كبيرة من واجهة برمجة التطبيقات (API) التي تستخدم DBNull، ولا يمكن تغييرها.

مجرد اقتراح ولكن ما أفعله عادةً هو:

  1. يجب أن تكون جميع المتغيرات التي تحتوي على بيانات مقروءة من قاعدة بيانات أو مكتوبة عليها قادرة على التعامل مع القيم الخالية.بالنسبة لأنواع القيمة، هذا يعني جعلها Nullable(Of T).بالنسبة للأنواع المرجعية (String وByte())، فهذا يعني السماح للقيمة بأن تكون لا شيء.
  2. اكتب مجموعة من الوظائف للتحويل ذهابًا وإيابًا بين "الكائن الذي قد يحتوي على DBNull" و"متغير .NET القابل للإلغاء".قم بلف كافة الاستدعاءات إلى واجهات برمجة التطبيقات ذات نمط DBNull في هذه الوظائف، ثم تظاهر بأن DBNull غير موجود.

إذا كنت تستخدم الإعداد BLL / DAL محاولة معهد التمويل الدولي عند قراءة في وجوه في DAL

While reader.Read()
 colDropdownListNames.Add(New DDLItem( _
 CType(reader("rid"), Integer), _
 CType(reader("Item_Status"), String), _
 CType(reader("Text_Show"), String), _
 CType( IIf(IsDBNull(reader("Text_Use")), "", reader("Text_Use")) , String), _
 CType(reader("Text_SystemOnly"), String), _
 CType(reader("Parent_rid"), Integer)))
End While

ويمكنك استخدام وظيفة IsDbNull:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If

لالصفوف التي تحتوي على سلاسل، يمكنني تحويلها إلى سلاسل كما في تغيير

tmpStr = nameItem("lastname") + " " + nameItem("initials")

إلى

tmpStr = myItem("lastname").toString + " " + myItem("intials").toString

لالمقارنة في إذا بيان <م> myItem ( "سيد") = SID ، فإنه يحتاج إلى أن يكون التغيير إلى

myItem("sID").Equals(sID)

وبعد ذلك سيتم تشغيل التعليمات البرمجية بدون أية أخطاء وقت التشغيل بسبب <م> vbNull البيانات.

   VB.Net
   ========
    Dim da As New SqlDataAdapter
    Dim dt As New DataTable
    Call conecDB()        'Connection to Database
    da.SelectCommand = New SqlCommand("select max(RefNo) from BaseData", connDB)

    da.Fill(dt)

    If dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) = "" Then
        MsgBox("datbase is null")

    ElseIf dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) <> "" Then
        MsgBox("datbase have value")

    End If

مرحبا أيها الأصدقاء

هذه هي أقصر طريقة للتحقق من db Null في DataGrid وتحويلها إلى سلسلة

  1. قم بإنشاء حدث التحقق من صحة الخلية واكتب هذا الرمز
  2. إذا Convert.ToString(dgv.CurrentCell.Value) = "" إذن
  3. القيمة الحالية للخلية = ""
  4. إنهاء إذا

هذا هو حتى الآن أسهل طريقة للتحويل DBNull إلى سلسلة.الحيلة هي أنك لا تستطيع استخدم ال TRIM الوظيفة (التي كانت مشكلتي الأولية) عند الإشارة إلى الحقول من قاعدة البيانات:

قبل (رسالة الخطأ المنتجة):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))

بعد (لا مزيد من الرسائل الخطأ :-) ):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))

وأعتقد أن هذا يجب أن يكون أسهل بكثير لاستخدام:

<اقتباس فقرة>   

وحدد ISNULL (مبلغ (حقل)، 0) من TABLENAME

ونسخ من: <لأ href = "http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ" يختلط = "نوفولو" > http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top