التعامل مع بيانات dbnull في vb.net
سؤال
أرغب في إنشاء بعض المخرجات المنسقة للبيانات التي تم استردادها من قاعدة بيانات 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، ولا يمكن تغييرها.
مجرد اقتراح ولكن ما أفعله عادةً هو:
- يجب أن تكون جميع المتغيرات التي تحتوي على بيانات مقروءة من قاعدة بيانات أو مكتوبة عليها قادرة على التعامل مع القيم الخالية.بالنسبة لأنواع القيمة، هذا يعني جعلها Nullable(Of T).بالنسبة للأنواع المرجعية (String وByte())، فهذا يعني السماح للقيمة بأن تكون لا شيء.
- اكتب مجموعة من الوظائف للتحويل ذهابًا وإيابًا بين "الكائن الذي قد يحتوي على 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 وتحويلها إلى سلسلة
- قم بإنشاء حدث التحقق من صحة الخلية واكتب هذا الرمز
- إذا Convert.ToString(dgv.CurrentCell.Value) = "" إذن
- القيمة الحالية للخلية = ""
- إنهاء إذا
هذا هو حتى الآن أسهل طريقة للتحويل 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