从数据库读取值
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 = ""
我正在尝试根据传递到我的函数中的参数从数据库中读取单个条目。我知道连接字符串工作正常,因为我在其他地方使用它,我的 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 = ""