我正在尝试根据传递给我的函数的参数从数据库中读取单个条目。我知道连接字符串正在工作,因为我在别处使用它,我的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
答案 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中有异常,则该值最后只是一个空字符串。