2013-10-10 73 views
0

我想在綁定它之前檢查數據行中是否存在列,但column.contains屬性不起作用。不知道我在這裏錯過了什麼。如何檢查數據列中是否存在列

下面是代碼:

Private Sub Bind(ByRef reader As SqlDataReader) 
    Dim dt As DataTable = reader.GetSchemaTable 

    list = New List(Of Employees) 

    For Each r As DataRow In dt.Rows 
     BindObject(r) 
     list.Add(obj) 
    Next 

End Sub 

Private Sub BindObject(ByRef dr As DataRow) 
    obj = New Employees 
    If dr.Table.Columns.Contains("ID") Then obj.VisitID = CType(dr("ID"), Integer) 
End Sub 

解決方案:

由@ajakblackgoat提供該解決方案如下工作絕對沒問題。

If dt.Select("ColumnName='ID'").Count = 1 Then obj.VisitID = CType(dr("ID"), Integer) 

我想出了其他兩種解決方案,它可以幫助別人。

替代的解決方案我:

Dim dt As DataTable = reader.GetSchemaTable 

    Dim columns = New List(Of String)() 

    For i As Integer = 0 To reader.FieldCount - 1 
     columns.Add(reader.GetName(i)) 
    Next 

    If columns.Contains("ID") Then obj.ID = CType(dr("ID"), Integer) 

替代的解決方案二:

Dim dt As New DataTable 

    dt.Load(reader) 

    If dr.Table.Columns.Contains("ID") Then obj.VisitID = CType(dr("ID"), Integer) 
+0

對於初學者來說,你不發表您的'BindObjectV2'方法。這似乎與你的問題有關。 –

+0

謝謝你的更正。 – user1263981

+0

'Columns.Contains'工作正常,不區分大小寫。你是否存在這樣的專欄?嘗試調試你的代碼。 – Magnus

回答

1

reader.GetSchemaTable回報讀者的所有列的信息。所以你必須找到列名而不是列。

使用下面的代碼檢查,如果列名讀者存在:

Dim dt As DataTable = dr.GetSchemaTable 

If dt.Select("ColumnName='ID'").Count = 1 Then 
    ' column name exists 
End If 
+0

感謝它的工作。你認爲它比Dim dt有效嗎?作爲DataTable dt.Load(閱讀器) – user1263981

+0

它不具有可比性。你應該知道'GetSchemaTable'與'Load'完全不同。 'GetSchemaTable'加載一個帶有讀者模式信息的數據表(即列名,數據類型等),而'Load(reader)'簡單地加載數據表和從數據庫讀取器返回的記錄。 – ajakblackgoat