Visual Studio Developer Center > Fóruns do Visual Studio > VB.NET e Visual Basic > Botão salvar do bindindnavigator n funciona

Respondido Botão salvar do bindindnavigator n funciona

  • segunda-feira, 1 de fevereiro de 2010 20:52
     
     
    Pessol, peguei esse cod. na net para o botão salvar do databindingnavigator mais n esta salvando no bd. eu do STOP e Rodo novamente e aparece as informações alteradas mais quando vo no BD n tem nd alterado.

    O q pode estar acontecendo.

    vlw

Respostas

  • quarta-feira, 3 de fevereiro de 2010 16:07
     
     Respondido Contém Código
    Olá, Ricardo, desculpe eu esqueci um detalhe:


    Você deve criar um CommandBuilder antes de fazer o Update:

    No Botão Atualizar defica:
    Dim cmb As New SqlCommandBuilder(da)

    depois atualize:
    da.Update(ds, "cooperativa")

    Um Exempo para que você entenda é do Macoratti, bem explicado:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    Dim strConexao As String
    
    strConexao = "server=(local);Trusted_Connection=yes;database=Teste"
    
    Dim objConexao As New SqlConnection(strConexao)
    
    Try
    
         objConexao.Open()
    
    Catch ex As Exception
    
        MsgBox(ex.GetBaseException)
    
    End Try
    
     
    
    ' Cria uma instância do objeto DataAdapter.
    
    Dim daClientes As New SqlDataAdapter("Select * From Clientes", objConexao)
    
    
    ' Cria uma instância de um DataSet, e retorna dados da tabela clientes
    
    Dim dsTeste As New DataSet("Clientes")
    
    daClientes.FillSchema(dsTeste, SchemaType.Source, "Clientes")
    
    daClientes.Fill(dsTeste, "Clientes")
    
    
    '--inserindo o registro no DataSet----------------------------------------------------------
    
    MsgBox("Agora vou inserir um registro no DataSet", MsgBoxStyle.Information, "Inserir Registro")
    
    Dim tblClientes As DataTable
    
    tblClientes = dsTeste.Tables("Clientes")
    
    ' Obtem um novo objeto DataRow do DataTable
    
    Dim drAtual As DataRow
    
    drAtual = tblClientes.NewRow()
    
    
    '' Define os novos valores de DataRow
    
    drAtual("Codigo") = 7
    
    drAtual("Nome") = "Testolina Testa"
    
    drAtual("Endereco") = "Rua Moscou , 109"
    
    ' Insere o novo objeto via método Add da coleção DataTable.Rows 
    
    tblClientes.Rows.Add(drAtual)
    
    MsgBox("Registro incluído com sucesso na tabela Clientes.", MsgBoxStyle.Information, "Incluindo dados no DataSet")
    
    
    '---------codigo para alterar os dados inseridos ----------------------------------------------
    
    MsgBox("Vou alterar o atual no DataSet", MsgBoxStyle.Information, "Alterar Registro")
    
    drAtual.BeginEdit()
    
    drAtual("nome") = "Yuri Gagarin"
    
    drAtual("endereco") = "R Lua Nova , 230"
    
    drAtual.EndEdit()
    
    MsgBox("Registro alterado com sucesso !", MsgBoxStyle.Information, "Alterando dados no DataSet")
    
    
    '-----------atualiza a tabela clientes do banco de dados Teste no SQL Server
    
    'Atualiza o SQL Server
    
    Dim objCommandBuilder As New SqlCommandBuilder(daClientes)
    
    daClientes.Update(dsTeste, "Clientes")
    
    MsgBox("A operações feitas no DataSet irão atualizar o SQL Server !" & Chr(13) & Chr(13) & " Verifique os dados no Servidor", MsgBoxStyle.Exclamation, "Atualização SQL Server")
    
    
    'exibe os dados do DataSet 
    
    DataGrid1.DataSource = dsTeste
    
    
    End Sub
    
    End Class
    
    

    Referências:

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/666835a2-50ec-415f-ba30-bb80ca51c91b

    http://social.msdn.microsoft.com/forums/pt-BR/vscsharppt/thread/a6ea5243-50f8-41e4-8963-7155bce29aa4/

    http://social.msdn.microsoft.com/forums/pt-BR/vsvbasicpt/thread/72cbff25-fd59-4cc6-a8f7-d614bfcec415/

    http://macoratti.net/vbn_upds.htm

    http://macoratti.net/vbn_dst1.htm
    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • terça-feira, 9 de fevereiro de 2010 12:03
     
     Respondido
    Segue um link de referência para você se orientar:

    http://support.microsoft.com/kb/308507
    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”

Todas as Respostas

  • terça-feira, 2 de fevereiro de 2010 10:21
     
     
    Olá Ricardo, acho que você esqueceu de postar o código.
    Espero ter te ajudado.

    Att. Alan.

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • terça-feira, 2 de fevereiro de 2010 14:23
     
     
    Foi mal Alan esqueci mesmo, segue o cod.

    Me.Validate()
    Me.BindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.DataSet)
  • terça-feira, 2 de fevereiro de 2010 15:11
    Moderador
     
     
    Ricardo,

    Esse é o código correto para se utilizar no botão Save do botão... Testei aqui só pra confirmar e rolou de boa...

    Que banco de dados você está utilizando? Como você fez para incluir a datasource no seu projeto?
    André Alves de Lima // Visite o meu site: http://andrealveslima.spaces.live.com //
  • terça-feira, 2 de fevereiro de 2010 15:23
     
     
    Ricardo,


    O código acima só funciona se vc tiver feito a conexão corretamente ao banco de dados. Qual banco e como você fez a conexão?


    visite: http://www.jacobsamuel.no.comunidades.net


    Att.

    Paulo
  • terça-feira, 2 de fevereiro de 2010 15:32
     
     
    Pessoal vlw pela atenção .... acaredito que todas as conexões estejam corretas já que fiz pelo o Wizard e o datagrid esta cerregando o BD normalmente.

    Estou usando o Acces como BD.

    Tbm tentei fazer via cod. deêm uma olhada por favor.

        Try

                conn = New OleDb.OleDbConnection(sConnString)

                conn.Open()

            Catch

                MsgBox("Erro ao Conectar ao banco de dados", , "Erro")

            End Try

            Dim da As OleDbDataAdapter = New OleDbDataAdapter _

            ("Select * from Cooperativa", conn)

            Dim ds As DataSet = New DataSet

            da.Fill(ds, "cooperativa")

            DataGrid1.DataSource = ds.Tables("cooperativa")

        End Sub

    até aqui esta td bem, mais o cod. que coloquei antes n funciona pq fica com aquele sublinhado azul. (lembrando q quero alterar na grid e gravar no BD. ) c souberem como faço isso n importa a forma. vlw

    abçs.


  • terça-feira, 2 de fevereiro de 2010 15:43
     
     

    Sublinhado azul?

    O que aparece na janela error list? Poste aqui para que possamos te ajudar.


    Espero ter te ajudado.

    Att. Alan.

    Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • terça-feira, 2 de fevereiro de 2010 17:12
     
     

    Alan... vou  tentar me explicar melhor.
    o primeiro aplicativo que coloquei fiz pelo Wizard e a unica coisa que acrescentei foi a programação do botão salvar, mais esta ocorrendo o erro já listado acima.
    utilizei um datagridview e bindingnavigator.

    o seg. aplicativo tentei fazer manualmente, utilizando somente a grid e um botão salvar.
    no 2° post coloquei o cod. do botão salvar que achei na net e que tentei utilizar no 1° aplicativo, mais esse mesmo cod. n funciona nesse 2° aplicativo pq n estou utilizando o bindingnavigator, por isso esta aparecendo a linha azul, eh como vc utilizar uma variavel que n foi declarada o vb n reconhece e destaca ela.

    sei fazer alterações utilizando o UPDATE com caixas TXT. agora como faço pra gravar as alterações feitas direto na grid???

    espero que tenha conseguido me fazer entender... agradeço a atenção de todos, abçs.

  • terça-feira, 2 de fevereiro de 2010 17:24
     
     
    Sugiro então a declaração do DataAdapter e do DataSet fora do método, pois o que for criado dentro do método perde a referência quando o mesmo termina, e use o comando abaixo no botão salvar:

    da.Update(ds, "cooperativa")
    []s.

    Att. Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • terça-feira, 2 de fevereiro de 2010 19:28
     
     
    Alan vlw mais uma vez... mais desculpa-me a ignorancia , mais o q seria fazer fora do metodo?
    tentei fazer o seguinte

    No module fiz as seguintes declarações:

    ******************************* MODULE ***************************

    Imports System.Data

    Imports System.Data.OleDb

    Module Module1

        Public conn As OleDb.OleDbConnection

        Public sConnString As String = _

                 "Provider=Microsoft.Jet.OLEDB.4.0;" & _

                "Data Source=" + Application.StartupPath + "\..\..\atendimento.mdb;"

        Public da As OleDbDataAdapter

        Public ds As DataSet = New DataSet

           

     

    End Module

    ******************************FIM MODULE *************************

    ************************** FORM LOAD *****************************

    Try

                conn = New OleDb.OleDbConnection(sConnString)

                conn.Open()

            Catch

                MsgBox("Erro ao Conectar ao banco de dados, ecerre o aplicativo", , "Erro")

            End Try

            da = New OleDbDataAdapter _

            ("Select * from Cooperativa", conn)

            da.Fill(ds, "cooperativa")

            DataGrid1.DataSource = ds.Tables("cooperativa")

    **************************FIM FORM LOAD**************************

    No botão salvar coloquei o q vc sugeriu

    deu o seguinte erro ao executa-lo:
    "Update requires a valid UpdateCommand when passed DataRow collection with modified rows."

    vlw e  obrigado novamente.
  • terça-feira, 2 de fevereiro de 2010 19:51
     
     

    Ricardo,

    Não sou programador profissional, com certeza o pessoal ae entende muito mais que eu. Só vou tentar ajudar.
    Uso na maioria das vezes o Acess e faço todos os códigos na UNHA, pois a manutenção fica bem mais fácil e melhor.

    Para conexões e salvamento dos dados uso sempre o código:

    Private Sub salvar()

     

            'declarações

            'conexão

            Dim cn As New OleDb.OleDbConnection

            Dim cmd As New OleDb.OleDbCommand

            cmd.Connection = cn

            cmd.CommandType = CommandType.Text

            'Define a string de conexão

            cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\CAMINHO\bancodados.mdb"

            cn.ConnectionString = cn.ConnectionString

            ' Abre a conexao.

            cn.Open()

     

            Try

                'Define as propriedades do objeto COmmand

                cmd.Connection = cn

                'Aqui você inclui a instrução que quiser do CRUD
                cmd.CommandText = "insert into TABELA(CAMPOS)values('" & txtPM.Text & "')"

     

                cmd.ExecuteNonQuery()

     

                'fecha a conexão

                cn.Close()

     

            Catch ex As Exception

                MsgBox(ex.Message())

            End Try

     

     

        End Sub


    visite: http://www.jacobsamuel.no.comunidades.net


    Paulo

  • quarta-feira, 3 de fevereiro de 2010 10:42
     
     
    Então Métodos ou procedimentos são ações da classe, no seu caso o Form. Prodem ser do tipo Sub ou Function.

    O que eu te falei é para retirar estas declarações fora do método (form Load):

    Dim da As OleDbDataAdapter

    Dim ds As DataSet = New DataSet

    O motivo é que você tem acesso a esses objetos em qualquer outro método. Ex: Click de um botão.

    Essa declaração ficaria logo abaixo do Public Class SeuForm

    Com isso Você terá acesso ao seu dataset em outros métodos como eu já disse assim como ao seu DataAdapter, podendo invocar o método Update dele para atualizar os registros do DataSet.


    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • quarta-feira, 3 de fevereiro de 2010 15:46
     
     
    JACOB...vlw pela ajuda + n estou inserindo dados apartir d uma TXT e sim atualizando os dados alterados na grid.


    ALAN.... eh somente o DS e DA q deve jogar fora do metodo? segui sua orientação e declarei o DS e DA fora do metodo mais continuou dando o mesmo erro no UPDATE:

    "Update requires a valid UpdateCommand when passed DataRow collection with modified rows."

    abçs
  • quarta-feira, 3 de fevereiro de 2010 16:07
     
     Respondido Contém Código
    Olá, Ricardo, desculpe eu esqueci um detalhe:


    Você deve criar um CommandBuilder antes de fazer o Update:

    No Botão Atualizar defica:
    Dim cmb As New SqlCommandBuilder(da)

    depois atualize:
    da.Update(ds, "cooperativa")

    Um Exempo para que você entenda é do Macoratti, bem explicado:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    Dim strConexao As String
    
    strConexao = "server=(local);Trusted_Connection=yes;database=Teste"
    
    Dim objConexao As New SqlConnection(strConexao)
    
    Try
    
         objConexao.Open()
    
    Catch ex As Exception
    
        MsgBox(ex.GetBaseException)
    
    End Try
    
     
    
    ' Cria uma instância do objeto DataAdapter.
    
    Dim daClientes As New SqlDataAdapter("Select * From Clientes", objConexao)
    
    
    ' Cria uma instância de um DataSet, e retorna dados da tabela clientes
    
    Dim dsTeste As New DataSet("Clientes")
    
    daClientes.FillSchema(dsTeste, SchemaType.Source, "Clientes")
    
    daClientes.Fill(dsTeste, "Clientes")
    
    
    '--inserindo o registro no DataSet----------------------------------------------------------
    
    MsgBox("Agora vou inserir um registro no DataSet", MsgBoxStyle.Information, "Inserir Registro")
    
    Dim tblClientes As DataTable
    
    tblClientes = dsTeste.Tables("Clientes")
    
    ' Obtem um novo objeto DataRow do DataTable
    
    Dim drAtual As DataRow
    
    drAtual = tblClientes.NewRow()
    
    
    '' Define os novos valores de DataRow
    
    drAtual("Codigo") = 7
    
    drAtual("Nome") = "Testolina Testa"
    
    drAtual("Endereco") = "Rua Moscou , 109"
    
    ' Insere o novo objeto via método Add da coleção DataTable.Rows 
    
    tblClientes.Rows.Add(drAtual)
    
    MsgBox("Registro incluído com sucesso na tabela Clientes.", MsgBoxStyle.Information, "Incluindo dados no DataSet")
    
    
    '---------codigo para alterar os dados inseridos ----------------------------------------------
    
    MsgBox("Vou alterar o atual no DataSet", MsgBoxStyle.Information, "Alterar Registro")
    
    drAtual.BeginEdit()
    
    drAtual("nome") = "Yuri Gagarin"
    
    drAtual("endereco") = "R Lua Nova , 230"
    
    drAtual.EndEdit()
    
    MsgBox("Registro alterado com sucesso !", MsgBoxStyle.Information, "Alterando dados no DataSet")
    
    
    '-----------atualiza a tabela clientes do banco de dados Teste no SQL Server
    
    'Atualiza o SQL Server
    
    Dim objCommandBuilder As New SqlCommandBuilder(daClientes)
    
    daClientes.Update(dsTeste, "Clientes")
    
    MsgBox("A operações feitas no DataSet irão atualizar o SQL Server !" & Chr(13) & Chr(13) & " Verifique os dados no Servidor", MsgBoxStyle.Exclamation, "Atualização SQL Server")
    
    
    'exibe os dados do DataSet 
    
    DataGrid1.DataSource = dsTeste
    
    
    End Sub
    
    End Class
    
    

    Referências:

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/666835a2-50ec-415f-ba30-bb80ca51c91b

    http://social.msdn.microsoft.com/forums/pt-BR/vscsharppt/thread/a6ea5243-50f8-41e4-8963-7155bce29aa4/

    http://social.msdn.microsoft.com/forums/pt-BR/vsvbasicpt/thread/72cbff25-fd59-4cc6-a8f7-d614bfcec415/

    http://macoratti.net/vbn_upds.htm

    http://macoratti.net/vbn_dst1.htm
    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • sexta-feira, 5 de fevereiro de 2010 00:38
     
     
    alan ... estou usando conexão com access, n tenho essa opção para mim, o mais proximo que aparece é OleDbCommand, e ele n aceita
    Dim cmd As OleDbCommand(da)

    abçs

  • sexta-feira, 5 de fevereiro de 2010 10:19
     
     
    Não é objCommand e sim o CommandBuilder:

    Dim

     

    cmd As New OleDbCommandBuilder(da)


    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • sexta-feira, 5 de fevereiro de 2010 15:47
     
     
    Alan n aparece OLEDBCOMMANDBUILDER para mim somente OLEDBCOMMAND

    Veja  o que estou importando:

    System
    System.data
    system.data.oledb
  • sexta-feira, 5 de fevereiro de 2010 15:50
     
     

    No intellisense não aparece, mas continua escrevendo que aparece.


    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • sexta-feira, 5 de fevereiro de 2010 19:12
     
     
    Alan deu erro: "Erro de sintaxe na instrução UPDATE" (T_T) ...
    O exemplo do macoratti não permite o usuario selecionar nd, ele faz uma alteração já programada mais copiei o Cod. fazendo as modificações para OLEDB e tinha dado o mesmo erro então fui na tabela e excluir uma coluna que tinha a mais e não era mensionada no cod. e deu certo.

    não tem uma forma de eu adaptar o cod. do mactoratti e, ao inves de atribuir os dados via cod. ao DataRow o cod. ser adicionado altomaticamente quando houver alteração na grid? c isso for possivel creio q resolveria o problema.
  • sábado, 6 de fevereiro de 2010 17:19
     
     
    Alan... descobri  que n da esse erro quando n faço alteração na coluna de checkbox ou seja, somente quando vou fazer alterações do checkbox que da erro.
    o pode ser isso?
  • sábado, 6 de fevereiro de 2010 19:45
     
     
    Cara, o jeito é você colocar um break quando vc invoca esse procedimento e através das janelas de depuração descobrir a sintaxe que está sendo gerada, ou seja, o comando de update. Ai vc poste aqui para que possamos te ajudar.
    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • segunda-feira, 8 de fevereiro de 2010 19:54
     
     
    Alan, como vc deve te reparado sou novato e n tenho mto experiencia, coloquei o break point mais como faço para ver a sintaxa?

    o erro da na seguinte linha: "da.Update(ds, "Cooperativa")"

    qnd passo o cursor por cima do DS aparece umas informações mais n encontrei a query do update e no DA n acontece nd.

    abçs
  • terça-feira, 9 de fevereiro de 2010 10:38
     
      Contém Código
    Não é nessa linha é quando ele vai executar, debugue com o F11 que você acha.

    Vai estar em um Bloco parecido com isto:

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _
            Protected Friend ReadOnly Property Adapter() As Global.System.Data.SqlClient.SqlDataAdapter
                Get
                    If (Me._adapter Is Nothing) Then
                        Me.InitAdapter
                    End If
                    Return Me._adapter
                End Get
            End Property
    No Me._adapter você terá acesso, ao UpdateCommand, SelectCommand, DeleteCommand e InsertCommand.
    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • terça-feira, 9 de fevereiro de 2010 11:51
     
     
    Alan... fiz com F11 ele foi mostrando o codigo mais chegou na linha do update deu erro e n mostrou o cod q vc disse
  • terça-feira, 9 de fevereiro de 2010 12:02
     
     
    Certo, então tente isto. No breakpoint no mesmo lugar que você deixou, abra a janela Immediate Ctrl + Alt + I e digite

    ?cmd.GetUpdateCommand().CommandText

    e precione enter.

    Deve aprerecer o UpdateCommand.

    Se não funcionar, não sei mais como te ajudar.
    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • terça-feira, 9 de fevereiro de 2010 12:03
     
     Respondido
    Segue um link de referência para você se orientar:

    http://support.microsoft.com/kb/308507
    []s.

    Alan. Twitter

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
  • terça-feira, 9 de fevereiro de 2010 12:13
     
     
    Alan.. deu erro: "'cmd.GetUpdateCommand' is not declared or the module containing it is not loaded in the debugging session."

    mais vlw ae pela atenção vo da uma olhada no link... o estranho eh q so da erro qnd faz alteração na coluna do checkbox

    abçs e obrigado mais uma vez