Jump to content
Blue_Wings

Le dados da .accdb no Windows Form mas não grava

Recommended Posts

Blue_Wings

Bom dia a todos, já a alguns dias que estou com o seguinte problema, comecei a fazer uma aplicação para gerir um grupo de pessoas, tendo como apoio um pequeno projeto que tinha feito na faculdade a uns anos atrás.

Neste momento tenho o Windows Form criado, que lê os dados da minha base de dados em Acess .accdb que está na mesma pasta do projecto.

Assim que o Windows Form abre consigo ver todos os dados que quero nas "Textbox", tenho botões para eliminar, gravar, novo e botões de navegação entre os vários registos que tenho na base de dados que também funcionam.

Mas se eliminar algum registo ou grave algum registo, enquanto estiver o Windows Form aberto aparenta estar tudo OK mas assim que fecho o Windows Form ele não grava nada na base de dados e fica como se não tivesse feito nada.

Tenho o Visual Studio 2012, não se se preciso de um OleDbDataAdapter ou será que já o tenho??? o meu conhecimento de .Net está um pouco esquecido...

Apenas sei que já criei um DataSet, um BindingSource e umTableAdapter da tabela que me convém, e com isso aparecem-me os dados nas texbobox através de (ter editado as databindings dessas mesmas texbox na secção de texto, usando o dataset que tinha criado e por ai chegar a tabela que me convém) tirando isso não tenho mais nada, falta-me alguma coisa para que possa eliminar dados e gravar dados na base de dados?

O código que tenho no botão de eliminar registo é: (que no meu projeto da faculdade funciona muito bem, neste é que não):


Private Sub btnPNCDelete_Click(sender As Object, e As EventArgs) Handles btnPNCDelete.Click
    If MsgBox("Delete Record?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2) = MsgBoxResult.Yes Then

        With Me.BindingContext(Me.Uniforms_SoftwareDataSet, "PNC")
            .EndCurrentEdit()
            .RemoveAt(.Position)
            Me.PNCTableAdapter.Update(Me.Uniforms_SoftwareDataSet.GetChanges(DataRowState.Deleted))
            Me.Uniforms_SoftwareDataSet.AcceptChanges()
        End With
    Else
        Me.Uniforms_SoftwareDataSet.RejectChanges()
    End If
End Sub

O código do botão de gravar é:

Private Sub Save_Records()
    With Me.BindingContext(Me.Uniforms_SoftwareDataSet, "PNC")
        .EndCurrentEdit()
        If Uniforms_SoftwareDataSet.HasChanges Then
            Try
                If MsgBox("Record has changes!" & vbCrLf & "Save changes?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2) = MsgBoxResult.Yes Then
                    Me.PNCTableAdapter.Update(Uniforms_SoftwareDataSet.GetChanges())
                    Uniforms_SoftwareDataSet.AcceptChanges()
                Else
                    Uniforms_SoftwareDataSet.RejectChanges()
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End With
End Sub

Eu tenho uma vaga ideia de que seria Me.OleDbDataAdapter.Update(Uniforms_SoftwareDataSet.GetChanges()) em vez de Me.PNCTableAdapter.Update(Uniforms_SoftwareDataSet.GetChanges()) ??

Desde já muito obrigado.

Cumprimentos,

Edited by ribeiro55

Share this post


Link to post
Share on other sites
Leonardo Pereira

Isso que te acontece deve ser porque o vb ao compilar a aplicação gera uma cópia da base de dados para a pasta Bin e assim anula tudo o que fazes.

Confirma:

No "solution explorer" carrega na tua base de dados e nas propriedades em "Copy to Ouput Directory" senão tiveres "Copy if Newer" mete e experimenta ;)

  • Vote 1

Share this post


Link to post
Share on other sites
Blue_Wings

Muito obrigado! Era isso mesmo, mas por curiosidade é normal atualizar só na pasta BIN?

Porque sendo assim a meu ver não faz muito sentido ter a outra cópia da base de dados fora da pasta BIN que é onde o Visual Studio põe a base de dados por defeito da primeira vez que é adicionada ao projeto.

:)

Share this post


Link to post
Share on other sites
Leonardo Pereira

Isso já não me perguntes a mim, mas deve haver uma razão certamente ;)

Edited by Leonardo Pereira

Share this post


Link to post
Share on other sites
Blue_Wings

Neste momento já grava, e elimina registos na perfeição, mas agora tenho outro problema, assim que abro o Windows Form, o primeiro registo que me aparece é o último que gravei (neste caso o staff number da pessoa em questão).

Já fui á base de dados e pedi explicitamente para ordenar por staff number, no entanto na textbox não aparece por essa ordem.

Estive a ver nas propriedades da texbox mas não tem nada para ordenar por Ascending / ordem ascendente.

Alguma ideia?

Obrigado

Share this post


Link to post
Share on other sites
Leonardo Pereira

Vai ao dataset, "Edit with ..." depois na tabela que queres carrega com o direitro e numa delas acho que preview data , tem a consulta sql que faz para buscar dados basta adicionar "ORDER BY IDStaffnunbe)

Share this post


Link to post
Share on other sites
Nelson Sousa

A base de dados não deve ser incluída no projeto.

Ao inserir uma base de dados em seu projeto, inclua apenas o Dataset com os objetos do banco de dados. Quando o VB lhe perguntar se deseja incluir o banco de dados no projeto, responda NÃO.


Um Abraço,

Nelson Sousa

Share this post


Link to post
Share on other sites
Blue_Wings

Nelson, Pois neste momento tenho uma base de dados que não está a ser actualizada e penso que a que te referes que neste momento está incluída no projeto porque aparece no Soluction Explorer e também está na pasta BIN, existe algum mal nisso? Ou o que posso fazer para corrigir isso?

Já agora aproveito para te perguntar o seguinte caso saibas, no meu projecto da faculdade tinha vários DataSets para cada uma das tabelas da minha base de dados, agora neste projeto que estou a criar apenas estou a usar 1 DataSet que tem todas as tabelas lá dentro... é apenas por uma questão de performance que se criam vários DataSets ou é indiferente?

Obrigado pelos esclarecimentos anteriores.

Edited by Blue_Wings

Share this post


Link to post
Share on other sites
Nelson Sousa

Na verdade em meus sistemas faço tudo via código, conexão com o banco de dados, inserções,atualizações, exclusões, etc.

Uso o Dataset, aquele arquivo de extensão XSD, somente para agilizar a criação dos meus relatórios, criando datatables específicas, etc.

Desde a época em que iniciei a minha vida de programador, se é que se pode chamar isso de vida..rrsrsrs, com o VBA do Access, nunca usei essas ferramentas de conexão com o banco de dados.

Sempre preferi fazer tudo "no braço". Dá mais trabalho, mas você tem o domínio completo de tudo o que ocorre no seu sistema.

Eu nunca inseri o banco de dados no projeto, mas me parece que a cada instalação, ou atualização que você fizer do seu sistema, o banco de dados será enviado junto. Já pensou se isso acontece depois de algum cliente ter cadastrado algumas centenas de produtos?

Meu conselho é você ter uma pasta padrão para seu sistema, e deixar o usuário escolher onde colocará o banco de dados. Uma vez feita essa escolha, você arquiva o caminho do banco de dados no registro do windows, num TXT ou num XML, e usa na string de conexão do seu sistema.

Isso é bom para o caso de usar seu sistema em rede.

Para solucionar seu problema, acho que seria apenas excluir o accdb do seu projeto, lembre-se de salvar uma cópia antes...rsrsrsrs


Um Abraço,

Nelson Sousa

Share this post


Link to post
Share on other sites
Blue_Wings

É possível ter a base de dados Access a ser acedida num servidor por internet?

Ou para isso tenho de converter tudo para SQL?

É que não me apetecia estar a converter tudo para SQL vai dar uma trabalheira :( para além da falta de conhecimento de SQL.

Share this post


Link to post
Share on other sites
Nelson Sousa

Usando o Access via internet eu nunca fiz, mas creio ser possível sim.

Só não aconselho muito pois o gerenciamento de uma base de dados Access pela internet deve ser bem complicado.

O MySQL é bem flexível e com boa confiabilidade, sendo de gerenciamento mais, digamos confortável. Ou seja, dá menos trabalho, principalmente na questão de BKPs.

Eu tenho sistemas com Access, trabalhando em máquinas 'stand alone" e em redes internas, com resultado bastante positivo. E, tenho sistemas com acesso via internet usando o MySQL como base de dados.

As mudanças de codificação não são tão extensas assim de uma base Access para MySQL. Se você trabalhar com as classes de acesso a dados corretamente vai mudar pouca coisa nelas. O que é um pouco chato é o uso de caracteres tipo # no Access que não tem o mesmo uso no MySQL, a formatação dos números, etc, mas você acaba se acostumando.


Um Abraço,

Nelson Sousa

Share this post


Link to post
Share on other sites
Rafael Santos da Silva
Em 24/04/2013 às 05:38, Leonardo Pereira disse:

Isso que te acontece deve ser porque o vb ao compilar a aplicação gera uma cópia da base de dados para a pasta Bin e assim anula tudo o que fazes.

Confirma:

No "solution explorer" carrega na tua base de dados e nas propriedades em "Copy to Ouput Directory" senão tiveres "Copy if Newer" mete e experimenta ;)

Leonardo . Muito Obrigado . Estou aprendendo a programar com bancos de dados e sua resposta me ajudou muito. 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.