Dot-Net
SqlCommand.ExecuteReader() 什麼時候返回 null?
使用呼叫該
SqlCommand.ExecuteReader()方法時,ReSharper 告訴我在之後使用 SqlDataReader 對象時可能會出現 NullReference 異常。因此,使用以下程式碼:
using (SqlConnection connection = GetConnection()) { using (SqlCommand cmd = connection.CreateCommand()) { cmd.CommandText = ; //snip using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { //snip } } } }該
while (reader.Read())線帶有下劃線。我的問題是閱讀器對象何時會為空?我從來沒有遇到過它,文件也沒有提到它可能是。我應該檢查它是否為空還是可以安全忽略?
為什麼 ReSharper 會認為它可能為空,例如,它允許我使用 SqlCommand 而不建議檢查它是否為空?我猜 ExecuteReader 方法上有一個屬性。
我已經確定了 ExecuteReader() 可以返回 null 的一個原因。
在我得到空值的情況下,我已經向我的客戶發送了一個腳本來更新儲存過程。我的客戶的 Sql Server (2000) 設置為 DB 使用者需要執行儲存過程的權限。當他們更新 SP 時,權限被刪除並且沒有重新分配。在這種情況下,SqlCommand.ExecuteReader() 返回 null。
重新分配權限解決了這個問題。
Resharper 是正確的,它可以返回 null。
一個特定的實現是否
ExecuteReader()不允許冒泡一個空值並不重要——事實上,IDataReader 是一個可以包含(或指向)空值的對象。
- 如果將來您決定使用不同的實現
IDbCommand呢?- 如果該 IDbCommnd 實現的下一次更新將在程式碼中包含允許冒泡為 null 的不同流程怎麼辦?
為了正確使用介面,您不需要知道介面實現內部發生了什麼——您只需要知道介面,現在介面允許 null 作為返回值。