parametro vazio na pesquisa em 3 camdas

12/06/2014

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

Melhor resposta

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

Responder Citar

Outras Respostas

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 Citar

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 Citar

13/06/2014

Rafael

[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 Citar

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 Citar

15/06/2014

Joel Rodrigues

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

16/06/2014

Manja

Obrigada Joel, era isso mesmo que eu queria.
Responder Citar