从数据库读取值

Reading value from database

我正在尝试根据传递到我的函数中的参数从数据库中读取单个条目。我知道连接字符串工作正常,因为我在其他地方使用它,我的 SQL 语句工作正常,因为我可以在 SQL 服务器中毫无问题地执行它。我遇到的问题是 "return" 语句。无论我把它放在哪里,我在哪里声明它,或者我把我的 While 循环放在哪里读取数据库 table 我在 'Return siteID' 上得到绿色的波浪线告诉我 "variable 'siteID' is used before it has been assigned a value"

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

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

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

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

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

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

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

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

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

Dim siteID As String = ""

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

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

Dim siteID As String = ""