.NET與SQL Server中“空值”辨析
發(fā)表時(shí)間:2024-06-10 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]初學(xué)數(shù)據(jù)庫(kù)編程我們可能會(huì)有一些對(duì)“空值”的疑問(wèn),比如通過(guò)編程新建的一個(gè)表中所有數(shù)據(jù)皆顯示為<NULL>,手動(dòng)添加并刪除文字后又變成了空白;一個(gè)字符串類型的字段,明明沒(méi)有填值,卻不等于"";用ADO.NET從數(shù)據(jù)庫(kù)中取值,每遇到有<NULL>的就出錯(cuò)……這...
初學(xué)數(shù)據(jù)庫(kù)編程我們可能會(huì)有一些對(duì)“空值”的疑問(wèn),比如通過(guò)編程新建的一個(gè)表中所有數(shù)據(jù)皆顯示為<NULL>,手動(dòng)添加并刪除文字后又變成了空白;一個(gè)字符串類型的字段,明明沒(méi)有填值,卻不等于"";用ADO.NET從數(shù)據(jù)庫(kù)中取值,每遇到有<NULL>的就出錯(cuò)……這需要我們正確認(rèn)識(shí).NET和SQL Server中幾種不同的“空值”。
1、真正的空值,也就是“沒(méi)有輸入的值”,可以出現(xiàn)在大多數(shù)類型的字段中(如果沒(méi)有別的約束條件),SQL server中表示為null,顯示為<NULL>,手工在SQL server企業(yè)管理器中輸入的方法是按Ctrl+0。它在.NET中對(duì)應(yīng)System.DBNull.Value。在T-SQL命令中,判斷一個(gè)值是不是空值,要用“is null”而不是“= null”;處理空值有個(gè)ISNULL函數(shù),它使用指定的值替換null。用ADO.NET從數(shù)據(jù)庫(kù)得到的空值無(wú)法自動(dòng)轉(zhuǎn)化為空字符串或Nothing,須手動(dòng)檢測(cè):如果得到System.DBNull.Value,則賦給數(shù)據(jù)對(duì)象Nothing或其它自定義的有意義的值。
2、空字符串(零長(zhǎng)度字符串),只出現(xiàn)在字符串類型(如nvarchar)的字段中,SQL server中表示為'',顯示為空白,手工在SQL server企業(yè)管理器中輸入時(shí)清空一個(gè)單元格即可。它在.NET中對(duì)應(yīng)System.String.Empty,也就是我們常用的""。在T-SQL命令中處理空字符串和處理一般的字符串沒(méi)什么區(qū)別。用ADO.NET從數(shù)據(jù)庫(kù)得到的空字符串也和一般的字符串沒(méi)什么區(qū)別。
相關(guān)的概念還有VB.NET中的Nothing和對(duì)應(yīng)于C#.NET中的null(注意這個(gè)null是C#.NET中的null而非SQL Server中null),它們?cè)?span lang="EN-US">.NET中是表示不引用任何對(duì)象的空引用的值,在傳入SQL server時(shí),根據(jù)不同的上下文環(huán)境,可能存為真正的空值(比如在更新一個(gè)字符串類型的字段值時(shí)),也可能調(diào)用在SQL server中自定義的默認(rèn)值(比如傳給一個(gè)有默認(rèn)值的存儲(chǔ)過(guò)程參數(shù)),也可能因?yàn)闊o(wú)法進(jìn)行類型轉(zhuǎn)換而引發(fā).NET異常。因此在用ADO.NET向SQL server中存儲(chǔ)數(shù)據(jù)時(shí)要慎用Nothing。