我有以下代码,该代码从数据库中选择数据并向表单上的标签输出值:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strConn As String = System.Configuration.ConfigurationManager.ConnectionStrings("yourConnectionString").ToString()
Dim sql As String = "SELECT aid FROM tbl_RAPA WHERE username=@username"
Dim conn As New Data.SqlClient.SqlConnection(strConn)
Dim objDR As Data.SqlClient.SqlDataReader
Dim Cmd As New Data.SqlClient.SqlCommand(sql, conn)
Cmd.Parameters.AddWithValue("@username", User.Identity.Name)
conn.Open()
objDR = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
While objDR.Read()
Label1.Text = objDR("aid")
End While
End Sub
但是,如果数据库中的值为空,则程序将运行错误。我有办法做到这一点,所以程序只返回一个空值而不崩溃吗?
我收到的错误消息是
System.InvalidCastException: 'Unable to cast object of type 'System.DBNull' to type 'System.Windows.Forms.Label'.'
行上的Label1.Text = objDR("aid")
最佳答案
数据库对象通常需要关闭和处置。即使出现错误,Using...End Using
块也会为您执行此操作。
由于您只需要一个数据,因此可以使用.ExecuteScalar
,它提供了结果集第一行的第一列。此方法返回一个对象。
尝试始终将.Add
方法与Parameters
一起使用。参见http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
还有一个:
https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
这是另一个
https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html
我不得不猜测数据库类型,因此,请检查您的数据库的真实值。
在关闭并断开连接之前,请勿更新用户界面。 (End Using
)。我在Using块之前声明了aid
,因此可以在该块之后使用。在将对象aid
添加到标签的Text之前,检查其是否为Nothing。
Imports MySql.Data.MySqlClient
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim aid As Object
Using conn As New MySqlConnection(ConfigurationManager.ConnectionStrings("yourConnectionString").ToString),
cmd As New MySqlCommand("SELECT aid FROM tbl_RAPA WHERE username=@username", conn)
cmd.Parameters.Add("@username", MySqlDbType.VarChar).Value = User.Identity.Name
aid = cmd.ExecuteScalar
conn.Open()
End Using
If Not IsNothing(aid) Then
Label1.Text = aid.ToString
End If
End Sub
关于sql - 在vb中从数据库中选择数据并将数据输出到标签中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60030950/