Линк к объектам из нетипизированных данных. Невозможно привести объект типа 'System.Int32' к типу 'System.String'. - PullRequest
0 голосов
/ 09 января 2010

Я совершенно не понимаю, почему linq выбрасывает Unable для приведения объекта типа System.Int32 к исключению типа System.String. Код является частью универсальной функции, предназначенной для извлечения DataTextField и DataValueField из нетипизированной DataTable и размещения их в списке KeyValuePair (из строки, строки). Я добавил для каждого цикла над запросом linq, чтобы пройти через каждый элемент, и это работало нормально. Данные, возвращаемые для DataValueField, являются числовыми, но находятся в нетипизированном наборе. Я попытался ToString () на полях, не уверен, что еще попробовать дальше. Любая помощь будет оценена.

    Private Function GetCurrentBoundControlDT(ByVal StoredProcedure As String, ByVal ParamList As String, ByVal DataTextField As String, ByVal DataValueField As String) As List(Of KeyValuePair(Of String, String))
        Dim ds As DataSet = Nothing
        Dim dt As DataTable = Nothing
        Dim BoundControlDataList As List(Of KeyValuePair(Of String, String)) = Nothing

        If ParamList.Trim <> String.Empty Then
            StoredProcedure = String.Format("{0} {1}", StoredProcedure, ParamList)
        End If

        ds = RG.GetDS(StoredProcedure)

        If Not ds Is Nothing AndAlso ds.Tables.Count > 0 Then
            dt = ds.Tables(0)

            'This works fine
            For Each r As DataRow In dt.Rows
                Dim test1 As String = r(DataTextField)
                Dim test2 As String = r(DataValueField)
                Dim kv As New KeyValuePair(Of String, String)(test1, test2)
            Next
            'Blows up here...
            BoundControlDataList = (From ThisTable In dt.AsEnumerable() _
                    Select New KeyValuePair(Of String, String)(ThisTable.Field(Of String)(DataTextField).ToString(), _
                                               ThisTable.Field(Of String)(DataValueField).ToString())).ToList()
        End If

        Return BoundControlDataList
    End Function

1 Ответ

0 голосов
/ 09 января 2010

удалось выяснить это. Это не совсем красиво, но работает. Кажется, что (из строки) не столько актерский состав, сколько предложение. Я думаю (объекта) должен обрабатывать любые примитивные данные правильно, и обертка Convert.ToString () вокруг поля сделала свое дело. Следующее изменение - то, что сделало это ...

            BoundControlDataList = (From t In dt.AsEnumerable() _
                                    Select New KeyValuePair(Of String, String)(Convert.ToString(t.Field(Of Object)(DataTextField).ToString()), _
                                     Convert.ToString(t.Field(Of Object)(DataValueField).ToString()))).ToList()
...