Определите свойства объекта и поместите в него значения - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу идентифицировать свойства конкретного объекта, который он получает при вызове метода, и помещать в него значения из результата БД, который я получил.Я искал об этом, но в настоящее время я застрял в том, как я должен идти отсюда.Вот мой код ..

Public Class DBModel
Public Sub getFromDB(ByRef lists As List(Of Object), ByVal classType As Type, ByVal tblName as String)

   Dim strSql As String = "SELECT * FROM " & tblName
   Dim props = classType.GetProperties()

    Try
        Using cnn As New SqlConnection("Data Source =  .\; Initial Catalog = DBName;" & "Integrated Security = True;")
            Using cmd As New SqlCommand(strSql, cnn)
                cnn.Open()
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    While dr.Read
                        For Each prop In props
                            For i As Integer = 0 To dr.VisibleFieldCount - 1
                                prop = dr.GetValue(i)
                            Next
                        Next
                        lists.Add(props)
                    End While
                End Using
            End Using
    End Using
        Catch e As Exception
            MessageBox.Show(e.ToString())
        End Try
End Sub
End Class

Я вызываю здесь метод getFromDB, чтобы заполнить список клиентов в этом классе, но я также вызову метод getFromDB из других классов другимдругой набор свойств ..

Public Class CustomerCtrler
   private _CustomerList As New List(Of Customer)

   Public Sub New()
    Dim dbModel As New DBModel
    Dim cust As New Customer
    dbModel.getFromDB(_CustomerList, cust.GetType, "CustTbl")
   End sub
End Class

Public Class Customer
    Public Property custID As Integer
    Public Property FirstName As String
    Public Property LastName As String
    Public Property DateRegistered As DateTime
End Class

Но я получил InvalidCastException, поэтому я искал о преобразовании типов данных, но я получил: «Тип значения Integer нельзя преобразовать вPropertyInfo "в строке 'prop = dr.GetValue (i)" ..

Я довольно новичок в объектно-ориентированном программировании, поэтому извините, если там много ошибок, но ваша помощь будет действительноцениться ..

1 Ответ

0 голосов
/ 14 февраля 2019

Я хотел бы пойти с чем-то вроде этого:

Public Function GetListFromDatabase(Of T As New)(tableName As String) As List(Of T)
    Dim itemType = GetType(T)
    Dim allProperties = itemType.GetProperties()
    Dim items As New List(Of T)

    Using connection As New SqlConnection("connection string here"),
          command As New SqlCommand($"SELECT * FROM [{tableName}]", connection)
        connection.Open()

        Using reader = command.ExecuteReader()
            Dim columnNames = reader.GetColumnSchema().
                                     Select(Function(column) column.ColumnName).
                                     ToArray()

            'Ignore properties that don't have a corresponding column.
            Dim properties = allProperties.Where(Function(prop) columnNames.Contains(prop.Name)).
                                           ToArray()

            Do While reader.Read()
                'We can do this because we have specified that T must have a
                'parameterless constructor by using "As New" in the method declaration.
                Dim item As New T

                For Each prop In properties
                    prop.SetValue(item, reader(prop.Name))
                Next

                items.Add(item)
            Loop
        End Using
    End Using

    Return items
End Function

Затем вы можете сделать это:

_CustomerList = dbModel.GetListFromDatabase(Of Customer)("CustTbl")

Вы, очевидно, можете создать вариант этого, если вы действительно хотитепередать существующий список, но я не вижу в этом смысла, если только список не может уже содержать элементы.

РЕДАКТИРОВАТЬ: Вот альтернативный способ получения имен столбцов устройства чтения данных.Я не проверял это, поэтому может быть, что "COLUMN_NAME" не совсем правильно, но это будет что-то очень похожее на это:

Dim schemaTable = reader.GetSchemaTable()
Dim columnNames = schemaTable.Rows.
                              Cast(Of DataRow).
                              Select(Function(row) CStr(row("COLUMN_NAME"))).
                              ToArray()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...