Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

m3oliveira

[Resolvido] C# + Access - Comando não traz dados ao Grid

Recommended Posts

Boa tarde,

 

Tenho uma pequena aplicação em C# com Access onde tenho o seguinte método de consulta:

 

public DataTable buscarSetor(string filtro)
       {
           DataTable tabela = new DataTable();
           string sql = "select * from Setor where descricao like '" + filtro + "*'";
           MessageBox.Show(sql);
           OleDbDataAdapter da = new OleDbDataAdapter(sql, strCon);
           da.Fill(tabela);

           return tabela;
       }

 

Evento click do botão btPesquisar:

 

private void btPesquisar_Click(object sender, EventArgs e)
       {
           SetorDAL obj = new SetorDAL();
           dtgvSetor.DataSource = obj.buscarSetor(txtFiltro.Text);
       }

 

bom ao utilizar este método buscarSetor, ele não traz dados nenhum ao grid, porém se passo a sql

 

select * from Setor, ele traz dados. Pensei que poderia ser erro no sql com like, porém testei diretamente no access e funcionou perfeitamente.

 

segue a sql que passei direto no Access

 

select * from setor where descricao like 'f*'

 

Onde estou errando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não está trazendo nada porque você não está fazendo ele retornar nada.

 

você terá que fazer assim:



private void btPesquisar_Click(object sender, EventArgs e)
       {
           SetorDAL obj = new SetorDAL();
           dtgvSetor.DataSource = buscarsetor(filtro)
       }

 

 

 

E o seu SELECT está errado, usamos "%" ao invés de "*":

 

"select * from Setor where descricao like '" + filtro + "%'";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não está trazendo nada porque você não está fazendo ele retornar nada.

 

você terá que fazer assim:



private void btPesquisar_Click(object sender, EventArgs e)
       {
           SetorDAL obj = new SetorDAL();
           dtgvSetor.DataSource = buscarsetor(filtro)
       }

 

 

Obrigado.

Não percebi diferença nesse código que passou do meu que postei acima. Instanciei o objeto do tipo SetorDAL, e setei o DataSource do DataGridView para receber o retorno (um DataTable) do método buscarSetor do objeto "obj", o que me passou esta a mesma coisa do meu, com a diferença que você não colocou o objeto criado para usar o método. O meu Método buscarSetor recebe uma string como parâmetro e me retorna um DataTable.

 

E o seu SELECT está errado, usamos "%" ao invés de "*":

 

"select * from Setor where descricao like '" + filtro + "%'";

 

Como eu disse, eu testei a SQL diretamente no Access e funcionou, o erro não é o *, o access utiliza o * e não o % como em outros bancos como Postgre, Oracle, etc...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho, eu utilizei o "%" e ele funciona normalmente no access.

 

Mas funcionou tudo ai?

 

 

Funcionou direitinho a SQL no access, mas ainda não traz nada...

 

se eu fizer no access

 

select * from Setor where descricao like 'i*' da certo mas subistituindo o * por % não funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente fazer com um dataset ao invés de um Datatable

 

Tem algum exemplo? Não trabalhei com datasets ainda, mas não gostaria daqueles exemplo de clicar e arrastar, se possível um que crie através de um método e retorne o mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No botão tente:

 

 

 

private void btPesquisar_Click(object sender, EventArgs e)
       {
      	dtgvSetor.Clear();
dtgvSetor.DataSource = buscarSetor(txtFiltro.Text);
dtgvSetor.Refresh();
       }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também não funcionou, não existe o método clear direto no Gridview, fiz por partes com

 

dtvgSetor.Rows.Clear();

dtvgSetor.Columns.Clear();

e até tentei setar o Grid como null, e depois dar o refresh, não funciona...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, com o DataSet não consegui popular o grid de forma alguma, por isso penso que não seja só substituir daquela forma, nem com o SQL que dava certo no DataTable. A unica coisa que não deu certo no DataTable foi mesmo o like.

 

Segue o código que fiz com o DataSet que pediu para substituir

 

public DataSet buscarSetor(string filtro)
       {
           DataSet tabela = new DataSet();
           string sql = "select * from Setor where descricao like '" + filtro + "*'";
           OleDbDataAdapter da = new OleDbDataAdapter(sql, Conecta.StringDeConexao);
           da.Fill(tabela);

           return tabela;
       }

 

private void btPesquisar_Click(object sender, EventArgs e)
       {
           SetorDAL obj = new SetorDAL();
           dtgvSetor.Rows.Clear();
           dtgvSetor.Columns.Clear();
           dtgvSetor.DataSource = obj.buscarSetor(txtFiltro.Text);
           dtgvSetor.Refresh();
       }

 

também para teste fiz:

 

private void btPesquisar_Click(object sender, EventArgs e)
       {
           SetorDAL obj = new SetorDAL();
           dtgvSetor.DataSource = null;
           dtgvSetor.Rows.Clear();
           dtgvSetor.Columns.Clear();
           dtgvSetor.DataSource = obj.buscarSetor(txtFiltro.Text);
           dtgvSetor.Refresh();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei o erro, creio eu.

 

Faça assim:

 

 

SetorDAL obj = new SetorDAL();
           dtgvSetor.DataSource = null;
           dtgvSetor.Rows.Clear();
           dtgvSetor.Columns.Clear();
           dtgvSetor.DataSource = obj.buscarSetor(txtFiltro.Text).Tables[0];
           dtgvSetor.Refresh();

 

 

Aqui vai um exemplo que eu fiz, em VB:

 

 

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
       Dim dgv As New DataGridView
       ConnectionString = con
       OleDB.FillDataSet("SELECT * FROM Funcionários").Tables(0).Rows(3).Item("Nome") = "Teste de mudança"


       Dim f As New Form

       dgv.Dock = DockStyle.Fill
       ConnectionString = con

       dgv.DataSource = OleDB.FillDataSet("SELECT * FROM Funcionários").Tables(0)


       dgv.Refresh()


       f.Controls.Add(dgv)
       f.Show()
       f.BringToFront()
       f.WindowState = FormWindowState.Maximized

       dgv.Rows(0).Cells("Nome").Value = "Teste"
       dgv.Refresh()
   End Sub

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Substitua sua instrução SQL para "SELECT * FROM <tabela>" veja se ele retorna, se sim é erro de Query, se não temos de averiguar

Funcionou, porém, como disse anteriormente, rodei a SQL apenas substituindo o parâmetro direto no banco e funcionou normal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.