Нулевое значение DataReader в List (из строки) vb.net - PullRequest
0 голосов
/ 07 января 2020

Я пишу функцию веб-службы в VB. net в хранимой процедуре на сервере SQL. Я думаю, что DataReader не возвращает никакого значения.

Вот моя хранимая процедура на Sql Сервер:

Create proc getVillageName
@village varchar(50)
as
Begin
    SELECT
    lookup_table.value FROM dbo.lookup_table INNER JOIN dbo.lookup_description ON 
    lookup_table.group_id = lookup_description.desc_id WHERE 
    lookup_description.description = 'Village' AND 
    lookup_table.value LIKE @village + '%'
End

Вот мой код:

Public Function GetVillage(ByVal villageName As String) As List(Of String)
    Dim strsql As String
    Dim Villagevalue As List(Of String)
    Dim param As SqlParameter
    Dim conn As New SqlConnection With {.ConnectionString = "Server=MINTOY_DEV\MIGSSERVER;Database=SouthLinkDBO;User=sa;Pwd=123;"}
    Dim cmd As New SqlCommand
    Dim reader As SqlDataReader

    Using conn
        strsql = "getVillageName"
        cmd = New SqlCommand(strsql, conn)
        cmd.CommandType = CommandType.StoredProcedure

        param = New SqlParameter("@village", villageName)
        cmd.Parameters.Add(param)

        conn.Open()
        reader = cmd.ExecuteReader
        While reader.Read
            Villagevalue.Add(reader.Item("value").ToString)
        End While

    End Using
End Function

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Вам не хватает строки:

        While reader.Read
            Villagevalue.Add(reader.Item("value").ToString)
        End While

    End Using

    Return Villagevalue '<-----------------
End Function

Вы смотрите предупреждения компилятора? VB скажет вам, если вы забудете оператор Return.

Еще лучше, откройте «Свойства проекта», щелкните вкладку «Компилятор» и установите для «Функция, возвращающая тип ссылки без возвращаемого значения» значение «Ошибка».


Кроме того, как это вообще работает?

Dim Villagevalue As List(Of String)

Это должно быть

Dim Villagevalue As New List(Of String)
0 голосов
/ 07 января 2020

Множество вещей, которые мы можем улучшить здесь:

Public Iterator Function GetVillage(ByVal villageName As String) As IEnumerable(Of String)
    Using conn As New SqlConnection("Server=MINTOY_DEV\MIGSSERVER;Database=SouthLinkDBO;User=sa;Pwd=123;"), _
          cmd As New SqlCommand("getVillageName", conn)

        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.Add("@village", SqlDbType.VarChar, 50).Value = villageName
        conn.Open()

        Using rdr As SqlDataReader = cmd.ExecuteReader()
            While reader.Read()
                Yield DirectCast(reader("value"), String)
            End While
        End Using
    End Using
End Function

Главное, что мы фактически возвращаем значение (Yield обрабатывает это для Iterator функций).

Если вам действительно нужен фактический List(Of String) (Подсказка: вы обычно этого не делаете; ваш код почти всегда будет работать намного лучше, если вы упорядочите вещи для работы с IEnumerable(Of T) для как можно дольше) вы можете добавить .ToList() при вызове этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...