Blue_Wings Posted April 24, 2013 at 05:56 AM Report #504601 Posted April 24, 2013 at 05:56 AM (edited) 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 April 24, 2013 at 10:00 AM by ribeiro55
Leonardo Pereira Posted April 24, 2013 at 08:38 AM Report #504615 Posted April 24, 2013 at 08:38 AM 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 😉 1 Report
Blue_Wings Posted April 24, 2013 at 02:16 PM Author Report #504678 Posted April 24, 2013 at 02:16 PM 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. 🙂
Leonardo Pereira Posted April 24, 2013 at 02:32 PM Report #504680 Posted April 24, 2013 at 02:32 PM (edited) Isso já não me perguntes a mim, mas deve haver uma razão certamente 😉 Edited April 24, 2013 at 02:32 PM by Leonardo Pereira
Blue_Wings Posted April 24, 2013 at 04:36 PM Author Report #504698 Posted April 24, 2013 at 04:36 PM 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
Leonardo Pereira Posted April 24, 2013 at 08:59 PM Report #504725 Posted April 24, 2013 at 08:59 PM 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)
Nelson Sousa Posted April 24, 2013 at 10:11 PM Report #504730 Posted April 24, 2013 at 10:11 PM 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
Blue_Wings Posted April 25, 2013 at 05:30 PM Author Report #504819 Posted April 25, 2013 at 05:30 PM (edited) 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 April 25, 2013 at 05:56 PM by Blue_Wings
Nelson Sousa Posted April 26, 2013 at 12:25 AM Report #504869 Posted April 26, 2013 at 12:25 AM 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
Blue_Wings Posted April 26, 2013 at 09:09 PM Author Report #504966 Posted April 26, 2013 at 09:09 PM É 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.
Nelson Sousa Posted April 26, 2013 at 11:29 PM Report #504976 Posted April 26, 2013 at 11:29 PM 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
Rafael Santos da Silva Posted July 22, 2017 at 07:18 PM Report #606102 Posted July 22, 2017 at 07:18 PM 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.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now