查詢資料庫,處理NULL值問題
在做機房收費系統時,每當從資料庫中查詢資料並顯示到窗體介面時,如果查詢的記錄中有欄位值為NULL時,就會報錯:
比如:(例子可能不恰當,因為註冊時不允許不輸入學生姓名。但是就是那個意思)卡號1(學號為1)上機時,在上機介面要顯示上機資訊:學號、姓名、性別、系別….. 。(上機時要聯結三個表:CardInfo、StudentInfo、OnOffLine。這裡就不細說了)但是,在從StudentInfo表中查詢資訊時,“學號”欄位為NULL,此時就會發生以上錯誤。
以下是我的StudentInfo表:
如何解決??
首先,我們知道要想把表中的資料顯示到介面,就需要定義的函式返回一個實體或一個數據表或一個數據集。由於顯示上機涉及到不止一個表,所以我的是返回資料集ds。
每當查詢表,將查詢資訊返回到資料集中,都要用到SqlHelper中的一個方法:ExecuteDataSet(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal parameter As SqlParameter()) As DataSet或過載方法 ExeCuteDataSet(ByVal cmdText As String, ByVal cmdType As CommandType)
在問題沒有解決之前我的ExecuteDataSet()方法是這樣寫的(以第一個過載方法為例):
Public Function ExecuteDataSet(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal parameter As SqlParameter()) As DataSet Dim sqlAdapter As SqlDataAdapter Dim ds As DataSet = New DataSet() cmd.Connection = conn cmd.CommandText = cmdText '設定執行的sql語句 cmd.CommandType = cmdType '執行語句的型別 cmd.Parameters.AddRange(parameter) '新增引數 sqlAdapter = New SqlDataAdapter(cmd) Try conn.Open() sqlAdapter.Fill(ds, "NewTable") '把從資料來源中選取的行新增到資料集中 Return ds '返回資料集ds Catch ex As Exception Return Nothing Finally Call CloseCmd(cmd) End Try End Function
要解決以上NULL值問題,ExecuteDataSet()方法是這樣寫的:
(注意與修改前程式碼的區別:主要是加了一個For迴圈,來判斷返回的資料集的表中的每一行的每個欄位是否有NULL值,如果有,則把該欄位值改為空值" ")
Public Function ExecuteDataSet(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal parameter As SqlParameter()) As DataSet
Dim sqlAdapter As SqlDataAdapter
Dim ds As DataSet = New DataSet()
cmd.Connection = conn
cmd.CommandText = cmdText '設定執行的sql語句
cmd.CommandType = cmdType '執行語句的型別
cmd.Parameters.AddRange(parameter) '新增引數
sqlAdapter = New SqlDataAdapter(cmd)
Try
conn.Open()
sqlAdapter.Fill(ds, "NewTable") '把從資料來源中選取的行新增到資料集中
'將資料集中為NULL值的欄位值轉換為空值
For i = 0 To ds.Tables("NewTable").Rows.Count - 1
For j = 0 To ds.Tables("NewTable").Columns.Count - 1
If IsDBNull(ds.Tables("NewTable").Rows(i)(j)) Then '判斷資料集中的每條記錄的每個欄位是否為NULL,如果為NULL則,設定欄位值為空值" "
ds.Tables("NewTable").Rows(i)(j) = " " '將欄位為NULL的值設定為空值" "
End If
Next
Next
Return ds '返回沒有NULL值的資料集ds
Catch ex As Exception
Return Nothing
Finally
Call CloseCmd(cmd)
End Try
End Function
當然,解決NULL值問題的方法還有很多,比如可以在設計資料庫表時,規定每個欄位值不許為空:
還可以用IsDBNull來判斷,等等。