Ir para o conteúdo
Blue_Wings

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

Mensagens Recomendadas

Blue_Wings    0
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,

Editado por ribeiro55

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Leonardo Pereira    1
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 ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Blue_Wings    0
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.

:)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Leonardo Pereira    1
Leonardo Pereira

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

Editado por Leonardo Pereira

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Blue_Wings    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Leonardo Pereira    1
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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nelson Sousa    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Blue_Wings    0
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.

Editado por Blue_Wings

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nelson Sousa    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Blue_Wings    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nelson Sousa    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rafael Santos da Silva    0
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. 

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.