none
DataGridView com Seleção/atualização RRS feed

  • Pergunta

  • Boa tarde,

    estou utilizando o MySql e tenho um formulário com uma datagridview que é populada através de um BindingSource que por sua vez recebe a consulta pelo 'DataSource' por uma função como descrito abaixo.

    public DataTable retMySQLTable(string sqlConsulta, string sqlAtualiza)
    {
    MySqlConnection conn;
    conn = AbrirBanco();
    DataTable dt = new DataTable();
    try
    {
    DataSet ds = new DataSet();
    MySqlDataAdapter adapter = new MySqlDataAdapter();
    adapter.SelectCommand =
    new MySqlCommand(sqlConsulta, conn);
    adapter.UpdateCommand =
    new MySqlCommand(sqlAtualiza, conn);
    adapter.Fill(ds);
    dt = ds.Tables[0];
    FecharBanco(conn);
    }
    catch (Exception ex)
    {
    string t;
    t = ex.Message;
    }
    return dt;
    }

    datagrid.datasource = retMySQLTable(sqlConsulta, sqlAtualiza);

    Os dados são apresentados normalmente mas não estou conseguindo gravar as alterações que devem ser efetuadas quando clicado um botão "Gravar" no formulário.

    Até tenho uma solução mas irei escrever muito código, que é varrer a grid toda vez que o botão for gravado, mas como existe um "UpdateCommand, InsertCommand e DeleteCommand" eu não gostaria de utilizar esta varredura..

     

    Se alguém puder me ajudar eu agradeço.


    mefdias
    sexta-feira, 19 de novembro de 2010 19:45

Respostas

Todas as Respostas

  • Marcio,

    Qual é o comportamento atual? Você está recebendo algum erro? Qual é o conteúdo desse seu sqlAtualiza que você está passando pra o seu método?


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    sexta-feira, 19 de novembro de 2010 21:08
    Moderador
  • Poxa obrigado pelo interesse,

    não ha mensagem de erro, a verdade é que não sei usar o procedimento de atualização do banco de dados. Como eu disse, exibir os dados eu consigo normalmente. Como a gravação dos dados deve ser através de um botão no formulário não sei qual comando utilizar e a função é única para o acesso e atualização dos dados em todo o sistema.

    update tabela set nome = :pnome where id_tabela = :aid_tabela

    Normalmente quando utilizo grids no visual c# toda vez que é clicado o botão 'Gravar' eu venho verificando linha a linha e atualizando, mas como existe a possibilidade de incluir sqls de atualização, inserção e delete não faz sentido fazer essa ganbiarra para atualizar os dados.


    mefdias
    domingo, 21 de novembro de 2010 23:10
  • segunda-feira, 22 de novembro de 2010 10:54
    Moderador
  • A minha situação é um pouco complicada, porque os dados retornados do dataadapter esta em uma única função, assim todo o sistema utiliza esta função onde eu passo o sql, mas o sql de atualização (delete, insert e update) precisam de parametros, mas, não sei como fazer isso generico, até fiz um array passando os nomes dos parâmetros mas não sei como executar o comando de atualização.
    mefdias
    terça-feira, 23 de novembro de 2010 14:12
  • Marcio,

    Você pode deixar o DataAdapter cuidar da montagem e passagem dos parâmetros para inserção, atualização e exclusão.

    Como você já usa um DataSet, quando você chama o Update do DataAdapter passando um DataSet, ele irá automaticamente executar as queries de insert, update ou delete para todas as alterações do DataSet, inclusive respeitando as Relations, confira:

    http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    terça-feira, 23 de novembro de 2010 15:20
    Moderador
  • Cara obrigado,

    pelo exemplo que você me passou ele cria automaticamente os sqls de atualização de dados.

    No datagridview.datasource passei o retorn da função (um dataset - datagridview.datasource = ds.Tables[0] ) e os dados são retornados normalmente, mas, qual o comando que utilizo para gravar os dados agora.

    No botão ja coloquei "ds.acceptchanges(), ds.tables[0].acceptchanges(), datagridview.commitedit(datagridviewdataerrocontexts.Commit)" mas os dados não sofrem alteração no banco de dados o que estou fazendo de errado?


    mefdias
    quarta-feira, 24 de novembro de 2010 12:52
  • Marcio,

    O próprio comando Update do DataAdapter já faz a atualização do banco. Um detalhe é que após a atualização você deve chamar o AcceptChanges para "aplicar as alterações no DataSet", isto para que se você chamar o Update novamente ele não tente fazer os Updates já salvos anterior, confira:

    http://msdn.microsoft.com/en-us/library/system.data.dataset.acceptchanges.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quarta-feira, 24 de novembro de 2010 13:11
    Moderador
  • Desculpa a minha ignorância, mas, não esta atualizando os dados. Achei que era porque eu estava fechando a conexão mas, mesmo assim não atualiza os dados.

    Veja como estou fazendo.

     

    public DataSet retMySQLTable(string sqlConsulta)

    {

     

    MySqlConnection conn;

    conn = AbrirBanco();

     

    DataSet ds = new DataSet();

     

    MySqlDataAdapter adapter = new MySqlDataAdapter();

    adapter.SelectCommand =

    new MySqlCommand(sqlConsulta, conn);

     

    MySqlCommandBuilder builder = new MySqlCommandBuilder(adapter);

     

    adapter.Fill(ds);

     

    //code to modify data in dataset here

    adapter.UpdateCommand = builder.GetUpdateCommand();

    adapter.Update(ds);

     

     

    //FecharBanco(conn);

     

     

    return ds;

    }

     

    No Form LOAD:

    DataSet

     

    ds = new DataSet();

    ds = retMySQLTable(

    "select * from operador");

    bsOperadores.DataSource = ds.Tables[0];

    dgvoperadores.AutoGenerateColumns =

    false;

    dgvoperadores.DataSource = bsOperadores;

    No Botão Salvar:

    ds.AcceptChanges();

     


    mefdias
    quarta-feira, 24 de novembro de 2010 18:01
  • Alguns detalhes:

    1) Você só precisa criar o SelectComand, os outros serão criados automaticamente baseados nele, então seu código vai ficar assim:

    MySqlConnection conn; 
    conn = AbrirBanco();
    
    DataSet ds = new DataSet(); 
    
    MySqlDataAdapter adapter = new MySqlDataAdapter(new MySqlCommand(sqlConsulta, conn)); 
    adapter.Fill(ds);
    
    //code to modify data in dataset here
    
    // atualiza
    adapter.Update(ds);
    
    
    

    2) O AcceptChanges você deve chamar depois do Update do Adapter se não der erros, o ideal seria tipo:

    try
    {
     // cria o connection, o command, o adapter e chama o update...
    
     // chama o AcceptChanges, se não der erro
     ds.AcceptChanges();
    }
    catch(Exception ex)
    {
     MessageBox.Show(ex.Message);
    }
    

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quarta-feira, 24 de novembro de 2010 18:16
    Moderador
  • Poxa, sinceramente não sei o que estou fazendo de errado, qualquer alteração realizada (Insert, Delete, Update) não é atribuida ao banco de dados.

    Fazendo um debug, eu vejo que os comandos SQL são criadas automaticamente no dataadapter mas não acontece nada no banco.

    Esta função que retorna o dataset esta em um arquivo .cs a parte e quando faço o AcceptChanges os dados dos controles somem, ao envés, de serem gravados.


    mefdias
    domingo, 28 de novembro de 2010 14:43
  • Marcio,

    O único motivo que vejo para isto não funcionar é você estar chamando o AcceptChanges antes do Update, fora isto teria que funcionar sem problemas.

    Tente ver as alterações do DataSet antes de salvar usando o método GetChages(), este método irá retornar as alterações, se houverem.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    domingo, 28 de novembro de 2010 21:24
    Moderador