parametro vazio na pesquisa em 3 camdas
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);
}
}
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
Curtidas 0
Melhor post
Joel Rodrigues
17/06/2014
Que bom que deu certo.
Por favor, marque a melhor resposta para sinalizar que o tópico foi resolvido.
Obrigado.
Por favor, marque a melhor resposta para sinalizar que o tópico foi resolvido.
Obrigado.
GOSTEI 1
Mais Respostas
Joel Rodrigues
12/06/2014
Você pode fazer de duas formas simples:
1) Usar um parâmetro opcional, inicializando o segundo argumento como null:
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:
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 }
GOSTEI 0
Manja
12/06/2014
E o metodo para chamar esses parametros? tentei assim:
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....
//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);
}
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....
GOSTEI 0
Rafael Souza
12/06/2014
[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
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
GOSTEI 0
Joel Rodrigues
12/06/2014
Experimente utilizar uma lista ao invés de um vetor, a manipulação fica mais flexível.
E para chamar:
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.
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.
GOSTEI 0
Joel Rodrigues
12/06/2014
Tem como melhorar isso aí, mas teste e veja no que dá.
GOSTEI 0
Manja
12/06/2014
Obrigada Joel, era isso mesmo que eu queria.
GOSTEI 0