我想发生的是,如果textbox3.Text
不等于data(0)
值,那么我希望触发MsgBox("test")
。但是,事实并非如此。如果textbox3
的值不存在data(0)
我希望MsgBox("test")
触发。我已经尝试了我能想到的所有变化,但我无法让它工作。
现在,如果textbox.Text
不等于data(0)
价值,什么都不会发生。但是,如果textbox3.Text
等于data(0)
那么Label3.Text = data(1)
和MsgBox("Join code has been applied.")
都有效。
Dim conn As New MySqlConnection
conn.ConnectionString = "server=;userid=;password=;database="
conn.Open()
Dim sqlquery As String = "SELECT * FROM joincodes WHERE code = '" & TextBox3.Text & "';"
Dim data As MySqlDataReader
Dim adapter As New MySqlDataAdapter
Dim command As New MySqlCommand
command.CommandText = sqlquery
command.Connection = conn
adapter.SelectCommand = command
data = command.ExecuteReader
While data.Read()
If data.HasRows() = True Then
If TextBox3.Text = data(0) Then
Label3.Text = data(1)
MsgBox("Join code has been applied.")
Else
MsgBox("test")
End If
End If
End While
代码中有一些内容需要更改。
- 数据库连接具有与其关联的"非托管资源",这意味着您必须 。使用完它们后,对它们进行处置((。为了避免一些繁琐的代码,VB.NET 方便地提供了
Using
语句。 - 最好为控件指定有意义的名称,因为更容易看到代码中发生的情况。 例如,如果你不小心输入了TextBox37,而你的意思是TextBox87,那就很难看到了,但你不会错误地为tbFavoriteColor键入tbUserName。
- 在MySQL中,
CODE
是一个关键字,因此您需要使用反引号对其进行转义以确保安全:MySQL关键字和保留字 - 将变量直接放入 SQL 语句中通常是一个错误。SQL 参数用于执行此操作;它们易于使用并防止很多问题。
- 如果您依赖于数据库查询中列的顺序(例如
data(0)
(,则必须在查询中指定该顺序(例如SELECT `col1`, `col2` FROM joincodes
(,因为如果您使用*
那么它们可以按任何顺序返回。 - 您可能只对数据库中的第一个返回值感兴趣(如果有返回值(,所以我添加了
ORDER BY `col1` LIMIT 1
。 - 始终使用
Option Strict On
。它将节省您的时间。
关于所问的问题,您需要做的就是有一个标志,我使用了一个名为success
的布尔变量来指示事情是否顺利。
我还在以下代码中添加了一些用'TODO:
指示的要点,您需要注意这些要点以确保其正常工作:
Option Infer On
Option Strict On
Imports MySql.Data.MySqlClient
' ... (other code) ... '
'TODO: Any type conversion from the string TextBox3.Text.'
'TODO: Give TextBox3 a meaningful name.'
Dim userCode = TextBox3.Text
Dim connStr = "your connection string"
Using conn As New MySqlConnection(connStr)
'TODO: Use the correct column names.'
Dim sql = "SELECT `col1`, `col2` FROM `joincodes` WHERE `code` = @code ORDER BY `col1` LIMIT 1"
Using sqlCmd As New MySqlCommand(sql, conn)
'TODO: Use correct MySqlDbType and change .Size if applicable.'
sqlCmd.Parameters.Add(New MySqlParameter With {.ParameterName = "@code", .MySqlDbType = MySqlDbType.String, .Size = 24, .Value = userCode})
Dim success = False
Dim rdr = sqlCmd.ExecuteReader()
If rdr.HasRows Then
rdr.Read()
'TODO: Change GetString to the appropriate Get<whatever>.'
If rdr.GetString(0) = userCode Then
success = True
'TODO: Check that `col2` is a string - change the GetString call as required and call .ToString() on the result if needed.'
Label3.Text = rdr.GetString(1)
MessageBox.Show("Join code has been applied.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If
If Not success Then
MsgBox("test")
End If
End Using
End Using