none
Atualizar Base de Dados a partir de uma DataTable em VB.net/WPF RRS feed

  • 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

    segunda-feira, 7 de novembro de 2011 17:20

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
    terça-feira, 8 de novembro de 2011 17:07

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
    terça-feira, 8 de novembro de 2011 02:47
    Moderador
  • 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
    terça-feira, 8 de novembro de 2011 16:00
  • 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
    terça-feira, 8 de novembro de 2011 17:07