0

我正在尝试根据传递给我的函数的参数从数据库中读取单个条目。我知道连接字符串正在工作,因为我在其他地方使用它,并且我的 SQL 语句工作正常,因为我可以在 SQL Server 中毫无问题地执行它。我遇到的问题是“return”语句。无论我把它放在哪里,我在哪里声明它,或者我把我的 While 循环放在哪里读取数据库表,我都会在“返回 siteID”上得到绿色的波浪线,告诉我“变量 'siteID' 在被赋值之前已被使用”

Public Function GetSiteID(ByVal siteName As String) As String

    Dim strConnectionString2 As String = ConfigurationManager.ConnectionStrings("AVDataConnectionString").ConnectionString


    Dim strQueryString2 As String = "SELECT SourceSite.SourceSiteID FROM[AVData].[dbo].[SourceSite] JOIN [AVData].[dbo].[SourceSiteMetaTag] ON SourceSite.SourceSiteID=[SourceSiteMetaTag].[SourceSiteID] WHERE SourceSiteMetaTag.TagName='SiteType' AND SourceSiteMetaTag.TagValue='Network'order by [Description] asc AND SiteName = '" & siteName & "'"

    Dim connection2 As New SqlConnection(strConnectionString2)
    Dim command2 As New SqlCommand(strQueryString2, connection2)

    Dim siteID As String
    Try
        connection2.Open()
        Dim myReader As SqlDataReader = command2.ExecuteReader()
        While myReader.Read()
            siteID = myReader("SourceSiteID").ToString()
        End While
    Catch ex As Exception
        Throw ex
    Finally
        connection2.Close()
    End Try

    Return siteID

End Function
4

3 回答 3

1

正如警告告诉您的那样,您可能会返回一个从未设置过的值。这是因为如果您的查询没有返回任何行,则该变量将永远不会被设置,因为您不会进入 WHILE 循环。这意味着您需要处理 NOTHING 作为此方法调用的可能返回。

现在,这只是一个警告,因此您可以忽略它或为您的变量设置一个默认值,这会使警告消失,并且如果您不期待任何错误,也可以防止错误。对于字符串,这永远不会出错,但对于其他数据类型,它可能会出错,因此您应该养成在看到此警告时设置默认值的习惯。

要使警告消失,只需像这样声明它:

Dim siteID As String = ""
于 2016-02-09T18:33:55.607 回答
1

如果 myReader 永远不会读取(connection2 无法打开并且 try/catch 被触发),则永远不会为 siteId 分配值。

您可以通过在声明 siteId 时设置一个值来绕过此问题

Dim siteID As String = ""
于 2016-02-09T18:36:01.717 回答
0

当您将其值分配给时,您的阅读器似乎是空的siteID。这可能是因为您只从数据库中读取了一个值,并且myReader.read()在阅读器开始阅读后被激活。但后来他不再持有价值。尝试使用myReader.HasRows,一旦阅读器持有值,就会触发它。

我有一个类似的问题,从数据库中读取并给出控制台输出,并且myReader.Read()第一行总是丢失。就我而言,上面的解决方案帮助并修复了它。

您的新While-loop 应如下所示:

While myReader.HasRows()
    siteID = myReader("SourceSiteID").ToString()
End While

此外,第一次在 try 块中分配值是一个问题。你应该在上面声明它,使用类似的东西Dim siteID As String = "",这将解决任何编译器问题。如果 try-catch-block 内部存在异常,则该值最终将只是一个空字符串。

于 2016-02-09T18:24:10.113 回答