Dot-Net

SqlCommand.ExecuteReader() 什麼時候返回 null?

  • January 27, 2021

使用呼叫該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 作為返回值。

引用自:https://stackoverflow.com/questions/1072093