QUAL A MELHOR FORMA OU DESEMPENHO NO CODIGO?

LUIS.HERRERA 26/02/2013 11:14:55
#419640
Estou com algumas dúvidas de qual a forma ideal:

1- Para fechar uma conexão: Tem diferença ou pode gerar algum problema

if (cn.State == ConnectionState.Open)
ou
if (cn != null)
{
{
cn.Close();
cn.Dispose();
}
}


[b/2- Consultar no SQL Server string Sem levar em Conta Caixa Alta ou Baixa[/b]

Vou fazer uma consulta no banco, com um nome passado, porém quero retornar o ID independente de como está gravado ou foi digitado, ex:
Recursos Humanos = recursos Humanos, RECURSOS Humanos, etc....

Estou fazendo assim, será que a lógica está correta e SQL estão corretos?

public void Incluir(DepartamentosModelo departamento)
{
Int32 idDeptoExiste = 0; [txt-color=#007100]// variável para receber ID de registro já cadastrado[/txt-color]
idDeptoExiste = JaExiste(departamento.DEPTO.ToLower()); [txt-color=#007100]//passo o texto em minúsculas[/txt-color]

if (idDeptoExiste > 0)
{ /[txt-color=#007100]/rotina de inclusão no banco[/txt-color] }
else
{ [txt-color=#007100]//mensagem já existe no banco[/txt-color] }
}

public Int32 JaExiste(string filtro)
{
[txt-color=#007100]// Cria um DataReader Nulo para receber o conteúdo de pesquisa[/txt-color]
SqlDataReader dr = null;
AbrirConexao();

try
{
[txt-color=#007100]// Cria comando e faz consulta pelo parâmetro[/txt-color]
SqlCommand cmd = new SqlCommand([Ô]Select ID From Departamentos Where LOWER(DEPTO) = [ô][Ô] + filtro + [Ô][ô][Ô], cn);

dr = cmd.ExecuteReader();
if (dr != null)
{
[txt-color=#007100]// retornou conteúdo então existe[/txt-color]
return Convert.ToInt32(dr[[Ô]ID[Ô]].ToString());
}
else
{
return 0;
}
}
catch (SqlException ex)
{ throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number); }
catch (Exception ex)
{ throw new Exception(ex.Message);}
finally
{
if (dr != null)
{ dr.Close(); }
FecharConexao();
}
}
RXGOMES 26/02/2013 12:09:07
#419643
Resposta escolhida
Bom dia Luis

Na 1ª questão eu uso a propriedades ConnectionState, pois a conexão pode estar instanciada, porém fechada.

NO item 2 como o retorno é somente um campos e um registro apenas eu uso o faria o seguinte

 

public Int32 JaExiste(string filtro)
{
// Cria um DataReader Nulo para receber o conteúdo de pesquisa
int32 id = 0;
AbrirConexao();

try
{
// Cria comando e faz consulta pelo parâmetro
SqlCommand cmd = new SqlCommand([Ô]Select ID From Departamentos Where LOWER(DEPTO) = [ô][Ô] + filtro + [Ô][ô][Ô], cn);


// retornou conteúdo então existe
id = Convert.toInt32(cmd.executescalar);



}
catch (SqlException ex)
{ throw new Exception([Ô]Servidor SQL Erro: [Ô] + ex.Number); }
catch (Exception ex)
{ throw new Exception(ex.Message);}
finally
{

FecharConexao();
}

return id;
}

AJSO 26/02/2013 14:02:06
#419647
Caro LUIS HERRERA

Para a memória ou uso no código essas condições são a mesma para condições de fechamento da conexão nãofaz muita diferença dependendo da forma que utiliza
Principalmente com
SqlCommand command = new SqlCommand();
SqlDataAdapter adapter = new SqlDataAdapter();
Etc.....

são condições distintas para verificar a conexão ABERTA:

if (conection.State == ConnectionState.Open || conection.State == ConnectionState.Broken)

Essa normalmente utilizada na condição do
TRY
{
// Executa seu código..................
}
CATCH (Exception e)
{
//Trata a menssagem de erro.........
}
FINALLY
{
//fazer algo no finally para continuar rodando se código e eliminando as inconsistencias ocorrida... no caso (cn)
connection.Close()
//Ou
//connection.Dispose();
}
LUIS.HERRERA 26/02/2013 14:30:14
#419649
Boa tarde Ricargo e obrigado pela resposta.
Só uma dúvida, se o retorno do SQL (ExecuteScalar) não localizar registro cadastrado com esse critério, o que retornará? Um ZERO ou -1 ou Null?

Se ele está sendo associado a uma variável Int32, não poderia ser um valor não numérico?
RXGOMES 26/02/2013 17:12:12
#419656
Luis

Caso o sql não localizar o registro o retorno será a valor da variavel que foi seta (int32 id = 0;) ou seja neste caso 0;

Quanto a segunda pergunta pode ser um valor não numerico sim
Tópico encerrado , respostas não são mais permitidas