【问题标题】:Looping through SQLdatareader and comparing row values循环访问 SQLdatareader 并比较行值
【发布时间】:2015-08-11 15:24:04
【问题描述】:

我有一个调用存储过程的函数。我需要将结果与输入参数进行比较。我不断收到警告,该函数不会在所有代码路径上返回,但我不知道在哪里。

所以,有两个问题: 1. 我是否正确循环了SqlDataReader,还是应该用我的阅读器结果填充数据表? 2. 我在哪里遗漏了返回值?

功能代码:

Function FZCheck(FZ As String) As Boolean

    Dim constr As String = My.Settings.devTOD.ToString
    Dim con As New SqlConnection(constr)

    Dim cmd As New SqlCommand("spSelectFloodZones", con)
    cmd.CommandType = CommandType.StoredProcedure

    If con.State = ConnectionState.Closed Then
        con.Open()
    End If

    Dim rdr As SqlDataReader
    rdr = cmd.ExecuteReader

    If rdr.HasRows Then
        Do While rdr.Read
            If String.Equals(rdr(0).ToString, FZ) = True Then
                Return True
            Else
                Return False
            End If
        Loop
    Else
        Return False
    End If

    If con.State = ConnectionState.Open Then
        con.Close()
    End If

    rdr.Close()

End Function

存储的过程代码:(很简单)

ALTER PROCEDURE [dbo].[spSelectFloodZones]
AS
    SET NOCOUNT ON
    SET ROWCOUNT 0

-- ====================
-- Select flood zones
-- ====================

SELECT DISTINCT FloodZone
FROM TOD.dbo.FloodZones

语言是 VB.NET,使用 SQL Server 2012。

【问题讨论】:

  • 在 rdr.Close() 之后需要返回一个布尔值吗?
  • 为什么不将该参数传递给存储过程并使用 WHERE 子句更改其代码?您将避免 VB.NET 部分中的大量代码
  • @doza 我不确定我需要返回哪个布尔值。
  • @Steve 真是个好主意,不敢相信我没想到。我现在就试试。
  • 与问题无关,但最好使用Using 进行自动资源处理。

标签: sql vb.net sqldatareader


【解决方案1】:

这里进行一些小的重构。

Function FZCheck(FZ As String) As Boolean
        Dim constr As String = My.Settings.devTOD.ToString
        Dim con As New SqlConnection(constr)
        Dim result As Boolean = False

        Dim cmd As New SqlCommand("spSelectFloodZones", con)
        cmd.CommandType = CommandType.StoredProcedure

        If con.State = ConnectionState.Closed Then
            con.Open()
        End If

        Dim rdr As SqlDataReader
        rdr = cmd.ExecuteReader

        If rdr.HasRows Then
            Do While rdr.Read
                If String.Equals(rdr(0).ToString, FZ) = True Then
                    result = True
                End If
            Loop
        End If

        If con.State = ConnectionState.Open Then
            con.Close()
        End If
        rdr.Close()
        Return result
    End Function

【讨论】:

  • 只要让我(再等一分钟!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2015-05-19
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多