2010-02-09 82 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