在 While 数据中使用'Else'。读取()不起作用?



我想发生的是,如果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

最新更新