parametro vazio na pesquisa em 3 camdas
12/06/2014
0
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
Post mais votado
17/06/2014
Por favor, marque a melhor resposta para sinalizar que o tópico foi resolvido.
Obrigado.
Joel Rodrigues
Mais Posts
12/06/2014
Joel Rodrigues
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 }
12/06/2014
Manja
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....
13/06/2014
Rafael Souza
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
15/06/2014
Joel Rodrigues
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.
15/06/2014
Joel Rodrigues
Clique aqui para fazer login e interagir na Comunidade :)