Usuário com melhor resposta
DataGridView com Seleção/atualização

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
Respostas
-
Marcio,
Para isto você pode usar o Update do Data Adapter, confira alguns artigos:
http://support.microsoft.com/kb/308055
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)- Sugerido como Resposta Marcus Paulo Couto segunda-feira, 22 de novembro de 2010 14:37
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 6 de janeiro de 2011 11:50
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 -
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 -
Marcio,
Para isto você pode usar o Update do Data Adapter, confira alguns artigos:
http://support.microsoft.com/kb/308055
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)- Sugerido como Resposta Marcus Paulo Couto segunda-feira, 22 de novembro de 2010 14:37
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 6 de janeiro de 2011 11:50
-
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 -
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) -
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 -
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) -
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 -
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) -
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 -
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)