Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 482840
            [titulo] => parametro vazio na pesquisa em 3 camdas 
            [dataCadastro] => DateTime Object
                (
                    [date] => 2014-06-17 10:22:34
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 232232
            [status] => A
            [isExample] => 
            [NomeUsuario] => Joel Rodrigues
            [Apelido] => 
            [Foto] => 232232_20161017163010.jpg
            [Conteudo] => Que bom que deu certo.
Por favor, marque a melhor resposta para sinalizar que o tópico foi resolvido.
Obrigado. ) )

parametro vazio na pesquisa em 3 camdas

Manja
   - 12 jun 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);
}
}

Post mais votado

Joel Rodrigues
   - 17 jun 2014

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

Joel Rodrigues
   - 12 jun 2014

Você pode fazer de duas formas simples:
1) Usar um parâmetro opcional, inicializando o segundo argumento como null:
#Código

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:
#Código
public DataTable encher_Tabela(string sql)
{
	// operação sem parâmetros
}

Manja
   - 12 jun 2014

E o metodo para chamar esses parametros? tentei assim:

Citação:
//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....

Rafael
   - 13 jun 2014

Clique na imagem para abrir em uma nova janela

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

Joel Rodrigues
   - 15 jun 2014

Experimente utilizar uma lista ao invés de um vetor, a manipulação fica mais flexível.
#Código

public DataTable encher_Tabela(string sql, List<SqlParameter> parametros)
{
    if(parametros.Count > 0)
    {
        //então use os parâmetros
    }
    // ...
}


E para chamar:
#Código
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.

Joel Rodrigues
   - 15 jun 2014

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

Manja
   - 16 jun 2014

Obrigada Joel, era isso mesmo que eu queria.