2013-10-10 3 views
0

Я пытаюсь проверить, существует ли столбец в datarow, прежде чем привязывать его, но свойство column.contains не работает. Не знаю, чего мне здесь не хватает.Как проверить, существует ли столбец в Datarow

Вот код:

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) 

У меня есть два других решения, и это может помочь другим.

Альтернативное решение I:

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) 

Альтернативное решение II:

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 As DataTable dt.Load (reader) – user1263981

+0

Это не сопоставимо. Вы должны знать, что 'GetSchemaTable' полностью отличается от' Load'. 'GetSchemaTable' загружает данные с информацией о схеме для читателя (т. Е. Список имен столбцов, типы данных и т. Д.), Тогда как' Load (reader) 'просто загружает данные с записями, полученными от читателя из базы данных. – ajakblackgoat

Смежные вопросы