I can see some problems with your code.
You should use using
blocks for objects that are IDisposable
:
- MySqlConnection
- MySqlCommand
So:
-
using (var bdConn = new MySqlConnection(conexao))
-
using (var command = new MySqlCommand("... SQL aqui ...", bdConn))
In addition, the BeginExecuteNonQuery
method is the asynchronous version of the ExecuteNonQuery
method, so there is no need to call both methods.
Call only the ExecuteNonQuery
method since the intention is to wait for the result and execute something immediately afterwards in a synchronous way.
And to improve performance, validate the UI before scanning the database.
In the end, your code should look like this (I've put some comments to indicate what I did)
using (var bdConn = new MySqlConnection(conexao)) // o bloco using garante que o recurso
// será libarado ao sair do bloco
// de código
{
try
{
bdConn.Open();
}
catch
{
MessageBox.Show("Impossível conectar ao banco de dados, ligue o wamp server!");
}
if (textBox2.Text != null && textBox2.Text.Length >= 4) // fazer validações de
// interface (UI), antes das
// verificações no banco
{
bool resultado;
using (var usuaExiste = new MySqlCommand(
"SELECT * FROM contas WHERE nome = '" + textBox1.Text + "'",
bdConn)) // using do primeiro objeto MySqlCommand
// o que garante que será chamado o respectivo método Dispose()
{
resultado = usuaExiste.ExecuteReader().HasRows;
}
if (!resultado)
{
try
{
using (var criar =
new MySqlCommand(
"INSERT INTO contas (nome, senha) VALUES ('"
+ textBox1.Text + "','" + textBox2.Text +
"')", bdConn)) // using do segundo objeto MySqlCommand
// garantindo a chamada ao Dispose()
{
criar.ExecuteNonQuery();
MessageBox.Show("Conta Criada com sucesso!");
bdConn.Close(); // NOTA: o Close não é realmente necessário,
// uma vez que estamos colocando os devidos
// using nas variáveis IDisposable
}
}
catch (MySqlException ex)
{
MessageBox.Show(
"Erro ao criar a conta, informe isto ao desenvolvedor! \r\n "
+ ex);
}
}
}
else
{
MessageBox.Show(
"Por favor, certifique se sua senha não é muito curta, "
+ "seu usuário já é existente ou ele é muito curto.");
}
}
A valuable recommendation
You should not couple both the control code and the data access code. It would be interesting if you separate the control code, and data (and also the part of UI), because in the future, if you want to change your MySQL database to SQL Server or Oracle for example, you will have problems finding and correcting all points in your code.