列表中的DataReader的空值(字符串)vb.net

问题描述 投票:0回答:2

我正在用SQL Server中的存储过程在VB.net中编写Web服务功能。我认为DataReader不返回任何值。

这是我在Sql Server中的存储过程:

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
arrays vb.net stored-procedures
2个回答
2
投票

您缺少一行:

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

    End Using

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

您是否正在查看编译器警告?如果您忘记了Return语句,VB会告诉您。

[更好的是,打开项目属性,单击“编译器”选项卡,然后将“函数返回没有返回值的引用类型”设置为“错误”。


而且,这怎么工作?

Dim Villagevalue As List(Of String)

应该是

Dim Villagevalue As New List(Of String)

0
投票

我们可以在这里改进的很多事情:

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()

© www.soinside.com 2019 - 2024. All rights reserved.