Olá mais uma vez, hoje as dúvidas estão surgindo.
Seguinte, até o momento eu estava testando meu projeto no localhost, mas então decidi colocar o banco de dados em outra máquina e acessar pela rede. E foi ai que eu notei lentidão em alguns pontos.
Essa é minha função de conexão no banco de dados:
public class ConexaoDAO
{
protected static string Conecta = "DATABASE=nomedatabase; SERVER=192.168.0.0; UID=user; PWD=password";
protected MySqlConnection Conexao;
protected MySqlTransaction tr = null;
protected MySqlCommand Comando = null;
//MÉTODO PARA CONECTAR NO BANCO
public void AbrirConexao()
{
try
{
Conexao = new MySqlConnection(Conecta);
Conexao.Open();
}
catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
}
}
//METODO PARA FECHAR A CONEXAO COM O BANCO
public void FecharConexao()
{
try
{
if (Conexao != null)
{
Conexao.Close();
}
}
catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
}
}
}
Então, uma das partes que está lenta é por exemplo na função que retorna uma lista com os usuários do sistema :
public List<Usuario> BuscaUsuarios(string codGrupoUsuario, string nomeUsuario, string sobrenomeUsuario)
{
List<Usuario> usuarios = new List<Usuario>();
string conCodGrupoUsuario = codGrupoUsuario.Length > 0 ? "AND g.idgrupousuario = @idgrupousuario" : "";
string conNomeUsuario = nomeUsuario.Length > 0 ? "AND u.nome LIKE @nomeusuario" : "";
string conSobrenomeUsuario = sobrenomeUsuario.Length > 0 ? "AND u.sobrenome LIKE @sobrenomeusuario" : "";
try
{
AbrirConexao();
Comando = new MySqlCommand(@"SELECT *
FROM usuario u INNER JOIN grupo_usuario g
ON u.idgrupousuario = g.idgrupousuario
WHERE 1=1
" + conCodGrupoUsuario + @"
" + conNomeUsuario + @"
" + conSobrenomeUsuario + @"
ORDER BY u.idusuario;", Conexao);
if (codGrupoUsuario.Length > 0) { Comando.Parameters.AddWithValue("@idgrupousuario", codGrupoUsuario); }
if (nomeUsuario.Length > 0) { Comando.Parameters.AddWithValue("@nomeusuario", "%" + nomeUsuario + "%"); }
if (sobrenomeUsuario.Length > 0) { Comando.Parameters.AddWithValue("@sobrenomeUsuario", "%" + sobrenomeUsuario + "%"); }
IDataReader reader = Comando.ExecuteReader();
while (reader.Read())
{
Usuario usuario = new Usuario
{
UsuarioID = reader.GetInt32(reader.GetOrdinal("idusuario")),
Senha = reader.GetString(reader.GetOrdinal("senha")),
Grupousuario = grupousuarioBLL.BuscaGrupoUsuarioByID(reader.GetString(reader.GetOrdinal("idgrupousuario"))),
Nome = reader.GetString(reader.GetOrdinal("nome")),
Sobrenome = reader.GetString(reader.GetOrdinal("sobrenome")),
Email = reader.GetString(reader.GetOrdinal("email")),
Telefone = reader.GetString(reader.GetOrdinal("telefone"))
};
usuarios.Add(usuario);
}
}
catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
}
finally
{
FecharConexao();
}
return usuarios;
}
O problema está nessa parte :
Grupousuario =
grupousuarioBLL.BuscaGrupoUsuarioByID(reader.GetString(reader.GetOrdinal(“idgrupousuario”))),
Pois aqui eu chamo outra função, que busca o grupo que o usuário pertence. E nessa outra função eu chamo uma terceira função que busca e insere as permissões nesse grupo:
public GrupoUsuario BuscarGrupoUsuarioById(string cod)
{
GrupoUsuario grupousuario = new GrupoUsuario(); ;
try
{
AbrirConexao();
Comando = new MySqlCommand("SELECT * FROM grupo_usuario WHERE idgrupousuario = @idgrupousuario", Conexao);
Comando.Parameters.AddWithValue("@idgrupousuario", cod);
IDataReader reader = Comando.ExecuteReader();
if (reader.Read())
{
grupousuario = new GrupoUsuario
{
GrupoUsuarioID = int.Parse(reader.GetString(reader.GetOrdinal("idgrupousuario"))),
Nome = reader.GetString(reader.GetOrdinal("nome")),
Permissoes = permissaoBLL.BuscaPermissoesByIdGrupo(reader.GetString(reader.GetOrdinal("idgrupousuario"))).Todas
};
reader.Close();
}
else
{
grupousuario = null;
}
}
catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
}
finally
{
FecharConexao();
}
return grupousuario;
}
Bom, como vocês podem ver eu acabei fazendo uma função buscando outra. E cada uma dessas funções abre uma nova conexão. Estou pensando em alguma maneira de fazer isso de um jeito diferente, mas não sei certo por onde começar.
Alguma sugestão ?
Obrigado desde já