2010-02-09 93 views
4

我正在處理的一些表具有空值並引發錯誤。到目前爲止,我嘗試了幾個解決方案來處理空值,但沒有成功。SQLDataReader:處理空值

以下是我迄今爲止努力的代碼示例;

If (r("datemodified").Equals(DBNull.Value)) Then 
       datemodified = String.Empty 
      Else 
       datemodified = (r("datemodified")) 
      End If 

and;

If r.HasRows Then 
       datemodified = (r("datemodified")) 
      Else 
       datemodified = String.Empty 
      End If 

和;

If r("datemodified") = Nothing Then 
       datemodified = String.Empty 
      Else 
       datemodified = (r("datemodified")) 
      End If 

and;

If r.IsDBNull("datemodified") Then 
       datemodified = String.Empty 
      Else 
       datemodified = (r("datemodified")) 

and via sql;

Select isnull(datemodified, '') 

最終結果是IndexOutOfRangeException。

這裏是sql;

select datemodified, maintainedby, email, hitcount from grouping where id = @footid 

PS的,我已經跑了查詢,它工作正常(存在即所有的cols)

+0

'IOORE' _where_? – 2010-02-09 10:28:00

+0

datemodified(如果我對該行進行註釋,那麼它立即在維護的下一行上引發另一行)。空值的原因是人們更新頁面時,他們並不總是填寫詳細信息。我個人會拒絕空值,但分貝是遺產。 – Phil 2010-02-09 10:32:53

+0

你可以將你正在使用的SQL添加到你的問題中嗎? – Kamal 2010-02-09 10:44:51

回答

5

以處理代碼中的空值可以使用IsDBNull方法:

Dim index As Integer = r.GetOrdinal("datemodified") 
If r.IsDBNull(index) Then 
    datemodified = String.Empty 
Else 
    datemodified = r(index) 
End If 

爲了處理空值在SQL你必須給該領域的名稱,能夠通過名稱在數據讀取器訪問它:

select datemodified = isnull(datemodified, '') 
+0

謝謝你的幫助。在嘗試了這兩種方法後,問題仍然存在。 – Phil 2010-02-09 10:38:55

+1

然後問題出現在其他地方......在嘗試從數據讀取器獲取數據之前調用Read嗎?檢查r.FieldCount的值以查看結果中是否實際上有任何列,並且r.GetOrdinal(「datemodified」)查看該字段是否是其中的一個。 – Guffa 2010-02-09 12:47:59

+0

謝謝Guffa,它現在正在工作。非常感謝您的幫助! – Phil 2010-02-10 07:30:28

2

IndexOutofRangeException是您試圖訪問的列在結果集中不存在的原因。

當您通過SqlDataReader訪問Ordinal或Column時,必須指定Column Index或Column Name。在你的場景中,你需要爲返回的SQL列指定一個別名。

SELECT ISNULL(datemodified, '') AS [datemodified] 
+0

感謝您的幫助。編輯後,我有; 選擇ISNULL(日期修改,'')AS修改日期,維護日期,電子郵件,來自分組的地點,其中id = @footid。不幸的是,例外情況仍在發生。 – Phil 2010-02-09 11:05:26