I can see some problems with your code.
You should use blocks using
for the objects that are IDisposable
:
- Mysqlconnection
- Mysqlcommand
Thus:
using (var bdConn = new MySqlConnection(conexao))
using (var command = new MySqlCommand("... SQL aqui ...", bdConn))
In addition, the method BeginExecuteNonQuery
is the asynchronous version of the method ExecuteNonQuery
, so there is no need to call both methods.
Just call the method ExecuteNonQuery
since the intention is to wait for the result and execute something shortly afterwards synchronously.
And to improve performance, validate the UI interface before database checks.
At the end, your code should look something like this (I 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 shouldn’t be able to match both the control code and the data access code. It would be interesting if you separated the control code, and data code (and also the UI part), 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 the points in your code.
Try to comment on the line
criar.BeginExecuteNonQuery();
or callusuaExiste.Dispose();
after you fillresultado
.– Andre Calil