2009-11-27 48 views
0

我讀2表中的T-SQL就像這樣:如何測試DBNull以免崩潰「列....不屬於錶行」?

Select r.UID,c.Forename,c.Surname,c.DOB From c LEFT OUTER JOIN r on........

然後在VB.NET我遍歷數據集,像這樣:

For Each drR In dsR.Tables(0).Rows......Next 

但是當我測試,如下所示:

If Convert.IsDBNull(drR("r.UID")) Then 

或者

String.IsNullOrEmpty(drR("r.UID")) 
Convert.IsDBNull(r.UID)) 

列 'UID' 我崩潰不屬於表 行

當第二臺r表示無記錄。

我確實嘗試了r.UID和UID。

回收:當我在第二張表中有記錄時,一切都很好,但是當我不記得時,我該怎麼辦?我如何測試DBNull,以免崩潰「列....不屬於錶行」?

P.S.關於下面的兩個答案:我必須測試UID,以便知道第二個表中是否有記錄。

回答

3

你需要做一些事情來讓你的代碼飛行。

首先考慮使用INNER JOIN而不是LEFT OUTER JOIN來逐步解決問題。

或拆分問題並使用兩套工作。

一組具有的UID:

select r.Uid, c.Forename, c.Surname, c.DOB 
    from c 
inner join r 
    on c.forename=r.forename and c.surname=r.surname 

一組沒有的UID:

select c.Forename, c.Surname, c.DOB 
    from c 
    left outer join r 
    on c.forename=r.forename and c.surname=r.surname 
where r.Uid is null 

但是如果你需要用左表中的所有行做一次過,那麼你將需要檢查DBNull的,這裏是如何做到這一點:

If Not IsDBNull(drR("UID")) Then 
    'Success 
    Debug.Print(drR("UID")) 
Else 
    'Failure  
End If 

這是另一種方式做同樣的檢查:

If Not TypeOf drR("UID") Is DBNull Then 
    'Success 
    Debug.Print(drR("UID")) 
Else 
    'Failure  
End If 

,如果你還處於一個長期緊密的循環可能會通過索引列提高性能:

Dim dt as DataTable = DAL.GetYourDataTable() 
    Dim ixUID As Integer = dt.Columns.IndexOf("UID") 
    For Each dr As DataRow In dt.Rows 
     If Not IsDBNull(dr(ixUID)) Then 
      'Success 
      Debug.Print(dr(ixUID)) 
     Else 
      'Failure 
     End If 
    Next 
+0

thanx一百萬安德魯 – Fet 2009-11-30 08:33:46

0

查詢更改爲: 選擇ISNULL(r.UID, ''),c.Forename,c.Surname,c.DOB由C LEFT OUTER JOIN上

+0

感謝名單了很多伊沃,遺憾的是它仍然使用相同的消息崩潰...... – Fet 2009-11-27 15:22:14

0

R您可以使用AS別名如果指定用溶劑分解的建議

 
SELECT ISNULL(r.UID,'') AS 'UID' ...etc... 

這樣一來列有一個名字需要相結合,因此將取消檢查列名UID,如果它出現在另一臺測試列名。

希望這會有所幫助, 最好的問候, 湯姆。

+0

一個感謝名單很多湯姆,不幸的是它仍然與相同的消息崩潰... – Fet 2009-11-27 15:21:42

+0

@Greg:你可以在這裏發佈完整的TSQL代碼? TIA。 – t0mm13b 2009-11-27 15:41:54

0

填充數據集後暫停。然後在您的觀察窗口中添加以下內容以查看列名是什麼(假設r.UID是第一列,然後是列(0)) - 即列(列號 - 1)

dsR.Tables(0)。列(0).ColumnName