我正在用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
您缺少一行:
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)
我们可以在这里改进的很多事情:
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()
。