从数据库中读取值

时间:2016-02-09 16:49:07

标签: mysql vb.net database-connection executereader

我正在尝试根据传递给我的函数的参数从数据库中读取单个条目。我知道连接字符串正在工作,因为我在别处使用它,我的SQL语句工作,因为我可以在SQL Server中执行它没有问题。我遇到的问题是"返回"声明。无论我把它放在哪里,我在哪里声明它,或者我把我的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

3 个答案:

答案 0 :(得分:1)

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

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

要使警告消失,只需将其声明为:

Dim siteID As String = ""

答案 1 :(得分:1)

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

您可以通过在声明siteId时设置值来解决此问题

Dim siteID As String = ""

答案 2 :(得分:0)

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

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

您的新While - 循环应如下所示:

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

此外,在try-block中首次设置值是一个问题。您应该使用类似Dim siteID As String = ""的内容在上面声明它,这将解决任何编译器问题。如果try-catch-block中有异常,则该值最后只是一个空字符串。