parametro vazio na pesquisa em 3 camdas

12/06/2014

0

Boa tarde.

Estou fazendo meu primeiro modelo em 3 camadas, preciso que a camada banco reconheça quando passo e quando nao passo parametros, de acordo com a pesquisa q o usuario selecionar.

Se alguem tiver alguma ideia melhor é sempre bem vinda.

Camada banco:

public DataTable encher_Tabela(string sql, SqlParameter[] parametros)

{


conn.Open();
comando.Connection = conn;
comando.CommandText = sql;
if (parametros != null) nessa linha aqui da erro quando nao tem parametros ele continua passando.
comando.Parameters.AddRange(parametros);

comando.ExecuteNonQuery();



Na camada negocio:

//Criar o método Preencher DataGridView
public DataTable dgv_cheio()
{
string query = "select * from arq144 where seq144 = seq144 ";
SqlParameter[] sqlParameters = new SqlParameter[1];

if (nota != null)
{
query = query + " and nfnum = @nfnum ";

sqlParameters[0] = new SqlParameter("@nfnum", SqlDbType.VarChar);
sqlParameters[0].Value = nota;
query = query + " order by seq144 desc";
return dal.encher_Tabela(query, sqlParameters);
}
else
{
query = query + " order by seq144 desc";
return dal.encher_Tabela(query, sqlParameters);
}
}
Manja

Manja

Responder

Post mais votado

17/06/2014

Que bom que deu certo.
Por favor, marque a melhor resposta para sinalizar que o tópico foi resolvido.
Obrigado.

Joel Rodrigues

Joel Rodrigues
Responder

Mais Posts

12/06/2014

Joel Rodrigues

Você pode fazer de duas formas simples:
1) Usar um parâmetro opcional, inicializando o segundo argumento como null:
public DataTable encher_Tabela(string sql, SqlParameter[] parametros= null)
{
	if(parametros != null)
	{
		//então use os parâmetros
	}
	// ...
}


Assim você vai poder chamar o método passando ambos ou só o primeiro argumento, nesse caso o segundo continuará com o valor null.

2) Criar uma sobrecarga do método que receba só um argumento do tipo string:
public DataTable encher_Tabela(string sql)
{
	// operação sem parâmetros
}
Responder

12/06/2014

Manja

E o metodo para chamar esses parametros? tentei assim:

//Criar o método Preencher DataGridView
public DataTable dgv_cheio()
{
string query = "select * from arq144 where seq144 = seq144 ";
SqlParameter[] sqlParameters = new SqlParameter[0];

if (nota != null)
{
query = query + " and nfnum = @nfnum ";

SqlParameter[] sqlParameters1 = new SqlParameter[1];
sqlParameters1[0] = new SqlParameter("@nfnum", SqlDbType.VarChar);
sqlParameters1[0].Value = nota;
}

if (cnpj != null)
{
query = query + " and cnpjfo = @cnpjfo ";
SqlParameter[] sqlParameters2 = new SqlParameter[2];
sqlParameters[2] = new SqlParameter("@cnpj", SqlDbType.VarChar);
sqlParameters[2].Value = cnpj;
}

if (razaosocial != null)
{
query = query + " and razsoc = @razsoc ";
SqlParameter[] sqlParameters3 = new SqlParameter[3];
sqlParameters[3] = new SqlParameter("@razsoc", SqlDbType.VarChar);
sqlParameters[3].Value = razaosocial;
}


query = query + " order by seq144 desc";
return dal.encher_Tabela(query, sqlParameters);
}


Na pesquisa inicial retorna todos, porque o primeiro parametro esta zero.
Só que quando cai em um if ou mais de um, acusa erro e nao sei como resolver, nem sei se desta forma esta correta no c# (boas praticas).
No delphi eu fazia desta forma, o usuario escolhia quantos parametros iria passar....
Responder

13/06/2014

Rafael Souza

[img]http://arquivo.devmedia.com.br/forum/imagem/264793-20140613-125708.png[/img]

Desta forma vc mantém seu código passando sempre todos os parâmetros e o tratamento dos parâmetros vazios vc faz no banco.


Att,

Rafael Silva Souza
Responder

15/06/2014

Joel Rodrigues

Experimente utilizar uma lista ao invés de um vetor, a manipulação fica mais flexível.
public DataTable encher_Tabela(string sql, List<SqlParameter> parametros)
{
    if(parametros.Count > 0)
    {
        //então use os parâmetros
    }
    // ...
}


E para chamar:
public DataTable dgv_cheio()
{
	string query = "select * from arq144 where seq144 = seq144 ";
	List<SqlParameter> sqlParameters = new List<SqlParameter>(); 

	if (nota != null)
	{
		query = query + " and nfnum = @nfnum ";

		SqlParameter sqlParameters1 = new SqlParameter("@nfnum", SqlDbType.VarChar);
		sqlParameters1.Value = nota; 
		sqlParameters.Add(sqlParameters1);
	}

	//... continuar

	query = query + " order by seq144 desc";
	return dal.encher_Tabela(query, sqlParameters); 
}


Assim você poderá passar uma lista vazia, caso não queira usar parâmetros.

Obs: não testei, fiz apenas algumas modificações no texto direto.
Responder

15/06/2014

Joel Rodrigues

Tem como melhorar isso aí, mas teste e veja no que dá.
Responder

16/06/2014

Manja

Obrigada Joel, era isso mesmo que eu queria.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar