Usuário com melhor resposta
Atualizar Base de Dados a partir de uma DataTable em VB.net/WPF

Pergunta
-
Saudações!
O que o Josefinho quis em "http://social.msdn.microsoft.com/forums/pt-BR/vsvbasicpt/thread/cf30d4ec-e4f5-4d4b-8bbb-9e696e9d3cf1" é parecido com o que preciso com a seguinte diferença: Eu quero atualizar a Base de Dados com os dados na DataTable.
Contexto:
WPF / VS2010 / SQL Compact Edition: Tenho uma ComboBox (cbbPaises) cuja propriedade .DataContext é uma DataTable ("SELECT * FROM tabela_banco"). A cada vez que o utilizador escolhe uma das opções na cbbPaises, os TextBoxes são alterados ("DataContext="{Binding ElementName=cbbPaises,Path=SelectedItem}"").
Fino!
Ocorre que no modo Edição da Rotina o utilizador pode alterar qualquer informação em um dos TextBoxes. Se isso for feito eu quero atualizar a Base de Dados com a DataTable para evitar ter de citar todos os campos em um "UPDATE Paises SET [Pais]='" & Trim(txtPais.Text) &...".
É possível ou há alternativa?
WPF, (VB e ASP).NET e SQL 2008
- Editado Roberto Márcio de Souza segunda-feira, 7 de novembro de 2011 17:24 Contextualização
Respostas
-
Caríssimos, saudações!
O super Macoratti resolveu mais uma, completando a sugestão do Fernando Ferreira.
Ao implementar o Update ao AdaptadorSQLC obtive o erro acima. Então segui esta orientação do Macoratti (http://www.macoratti.net/vbn_cmb1.htm) e percebi que a adição da linha "CriadorComandoSQLC= New SqlCeCommandBuilder(AdaptadorSQLC)" resolvia o meu caso.
Ficou assim:
Public Function AtualizarRegistro(Tabela As DataTable, NomeTabela As String) As String Dim Comando As String = "SELECT * FROM " & NomeTabela ' SQL Compact Edition: Dim ConexaoSQLC As SqlCeConnection Dim ComandoSQLC As SqlCeCommand Dim AdaptadorSQLC As SqlCeDataAdapter Dim CriadorComandoSQLC As SqlCeCommandBuilder AtualizarRegistro = "Sucesso!" If TipoSQL = "CE" Then ConexaoSQLC = New SqlCeConnection(CriterioSQL) ComandoSQLC = New SqlCeCommand(Comando, ConexaoSQLC) AdaptadorSQLC = New SqlCeDataAdapter(ComandoSQLC) Try CriadorComandoSQLC = New SqlCeCommandBuilder(AdaptadorSQLC) AdaptadorSQLC.Update(Tabela) NumeroLinhas = Tabela.Rows.Count ConexaoSQLC.Close() ConexaoSQLC.Dispose() Catch ex As Exception Return "Erro a efetuar a conexão com o MS SQL Server!" & vbCrLf & ex.Message.ToString End Try End If End Function
Agradecido!
WPF, (VB e ASP).NET e SQL 2008- Editado Roberto Márcio de Souza terça-feira, 8 de novembro de 2011 17:09 Complementar
- Marcado como Resposta Roberto Márcio de Souza terça-feira, 8 de novembro de 2011 21:46
Todas as Respostas
-
Olá Roberto,
Já tentou utilizar o método Update do Table Adapter?
Link: http://msdn.microsoft.com/en-us/library/ms233819%28v=vs.80%29.aspx
Isso pode lhe ser útil...Outros links que podem lhe ajudar:
http://www.codeproject.com/KB/database/DataTableToDataBase.aspx
http://msdn.microsoft.com/en-us/library/0fx37fx7%28VS.71%29.aspx
http://msdn.microsoft.com/en-us/library/bh8kx08z%28VS.71%29.aspx
http://msdn.microsoft.com/en-us/library/3btz0xwf%28VS.71%29.aspx
http://stackoverflow.com/questions/2965020/c-sharp-asp-net-update-database-with-datatable
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique- Sugerido como Resposta Levi Domingos terça-feira, 8 de novembro de 2011 14:36
- Não Sugerido como Resposta Roberto Márcio de Souza terça-feira, 8 de novembro de 2011 21:46
-
Obrigado, Fernando!
Como são hiperligações, vou efetuar alguns testes para comprová-las e retorno.
De fato está longe de ser a minha solução, pelo que apresento um exemplo para aqueles que quiserem arriscar algo mais específico:
1- Se possível, não quero utilizar o UpdateCommand para evitar os casos em que as tabelas possuem muitas colunas;
2- Quero evitar, pelo mesmo motivo, o OleDbDataAdapter (estou usando o SQL CE);
3- No exemplo abaixo eu recebo o retorno "Update requer um UpdateCommand válido quando transferir a coleção DataRow com linhas modificadas":
Public Function AtualizarRegistro(Tabela As DataTable, NomeTabela As String) As String Dim Comando As String = "SELECT * FROM " & NomeTabela ' SQL Compact Edition: Dim ConexaoSQLC As SqlCeConnection Dim ComandoSQLC As SqlCeCommand Dim AdaptadorSQLC As SqlCeDataAdapter AtualizarRegistro = "Sucesso!" If TipoSQL = "CE" Then ConexaoSQLC = New SqlCeConnection(CriterioSQL) ComandoSQLC = New SqlCeCommand(Comando, ConexaoSQLC) AdaptadorSQLC = New SqlCeDataAdapter(ComandoSQLC) Try AdaptadorSQLC.Update(Tabela) NumeroLinhas = Tabela.Rows.Count ConexaoSQLC.Close() ConexaoSQLC.Dispose() Catch ex As Exception Return "Erro a efetuar a conexão com o MS SQL Server!" & vbCrLf & ex.Message.ToString End Try End If End Function
Chamado assim:If Operacao = "Editando" Then ' O DataTable será aquele que fornece dados aos TextBoxes e ComboBox.
txbMensagem.Text = AtualizarRegistro(Me.DataContext, "Distritos") If txbMensagem.Text <> "Sucesso!" Then Exit Sub End If
WPF, (VB e ASP).NET e SQL 2008- Editado Roberto Márcio de Souza terça-feira, 8 de novembro de 2011 16:36 Complementar
-
Caríssimos, saudações!
O super Macoratti resolveu mais uma, completando a sugestão do Fernando Ferreira.
Ao implementar o Update ao AdaptadorSQLC obtive o erro acima. Então segui esta orientação do Macoratti (http://www.macoratti.net/vbn_cmb1.htm) e percebi que a adição da linha "CriadorComandoSQLC= New SqlCeCommandBuilder(AdaptadorSQLC)" resolvia o meu caso.
Ficou assim:
Public Function AtualizarRegistro(Tabela As DataTable, NomeTabela As String) As String Dim Comando As String = "SELECT * FROM " & NomeTabela ' SQL Compact Edition: Dim ConexaoSQLC As SqlCeConnection Dim ComandoSQLC As SqlCeCommand Dim AdaptadorSQLC As SqlCeDataAdapter Dim CriadorComandoSQLC As SqlCeCommandBuilder AtualizarRegistro = "Sucesso!" If TipoSQL = "CE" Then ConexaoSQLC = New SqlCeConnection(CriterioSQL) ComandoSQLC = New SqlCeCommand(Comando, ConexaoSQLC) AdaptadorSQLC = New SqlCeDataAdapter(ComandoSQLC) Try CriadorComandoSQLC = New SqlCeCommandBuilder(AdaptadorSQLC) AdaptadorSQLC.Update(Tabela) NumeroLinhas = Tabela.Rows.Count ConexaoSQLC.Close() ConexaoSQLC.Dispose() Catch ex As Exception Return "Erro a efetuar a conexão com o MS SQL Server!" & vbCrLf & ex.Message.ToString End Try End If End Function
Agradecido!
WPF, (VB e ASP).NET e SQL 2008- Editado Roberto Márcio de Souza terça-feira, 8 de novembro de 2011 17:09 Complementar
- Marcado como Resposta Roberto Márcio de Souza terça-feira, 8 de novembro de 2011 21:46