Jump to content
MrGil

Problema ao actualizar BD access

Recommended Posts

MrGil

Olá,

Tenho uma duvida num projecto que estou a desenvolver que não consigo resolver:

Tenho uma form principal onde tenho um datagridview ligado a uma binding source, e depois tenho um segunda form onde há um formulário para adicionar novas linhas ao DGV na form principal, e posteriormente actualizar a base de dados.

Tudo funciona, aparentemente, como previsto, pois o datagridview é actualizado. Acontece que ao fazer o updateAll na TableAdapterManager, os dados não são enviados para a base de dados.

Depois acontece uma coisa bastante curiosa: Se tentar adicionar mais uma linha, a linha que introduzi anteriormente é enviada para a base de dados (Ou seja se adicionar 2 linhas apenas a primeira é adicionada, perdendo sempre a informação da ultima)

Codigo da form principal:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
NovaPesquisa.ShowDialog(FilaDeEsperaBindingSource)
GuardarFilaDeEspera()
End Sub

Public Sub GuardarFilaDeEspera()
Me.Validate()
FilaDeEsperaBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.QuaerereDataSet)
End Sub

(Já tentei averiguar o valor devolvido pela função updateAll, a primeira vez é 0 e apartir daí é 1 (visto que está simplesmente a introduzir a linha anterior)

Codigo da form como o formulário:

Private WithEvents myBindingSource As BindingSource
Public Overloads Sub ShowDialog(ByVal bindingsource As BindingSource)
myBindingSource = bindingsource
Me.ShowDialog()
End Sub

Private Sub btnConfirmar_Click(sender As Object, e As EventArgs) Handles btnConfirmar.Click
If String.IsNullOrWhiteSpace(comboActividade.Text) And String.IsNullOrWhiteSpace(comboLocalização.Text) Then
MessageBox.Show("Formulário inválido.", "Quaerere", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
myBindingSource.AddNew()
Me.Close()
End If
End Sub

Private Sub AddingNew_Handler(ByVal sender As Object, e As System.ComponentModel.AddingNewEventArgs) Handles myBindingSource.AddingNew
Dim dataTableView As DataView = TryCast(myBindingSource.List, DataView)
Dim row As DataRowView = dataTableView.AddNew()
row(COLUNA_PAÍS) = comboPaís.Text
row(COLUNA_ACTIVIDADE) = comboActividade.Text
row(COLUNA_LOCALIZAÇÃO) = comboLocalização.Text
row(COLUNA_ESTADO) = _PESQUISA_EM_ESPERA
e.NewObject = row
End Sub

Alguém me sabe dizer o que estou a fazer errado?

Obrigado desde já

Cumprimentos

Share this post


Link to post
Share on other sites
cdaniel.marques

Não tens que fazer:

Me.Validate()
FilaDeEsperaBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.QuaerereDataSet)

depois de:

myBindingSource.AddNew()

Para actualizar a binding source, o table adapter e o data set antes de fechar o form onde preenches os dados?

Edited by cdaniel.marques

Share this post


Link to post
Share on other sites
MrGil

cdaniel.marques, acontece a mesma coisa... a primeira entrada só é adicionada quando adiciono uma segunda e assim sucessivamente perdendo sempre informação...

Depois dessa tua dica ainda tentei passar, o tableAdapterManager e o Dataset como argumentos na overload do ShowDialog da segunda form... Continua a acontecer o mesmo.

Estou a ficar um pouco desorientado porque não faz muito sentido (para mim) a primeira vez não produzir qualquer efeito e a partir daí armazenar dados que já deviam ter sido armazenados.

De qualquer maneira obrigado pela atenção

Share this post


Link to post
Share on other sites
MrGil

bioshock, a unica diferença que encontrei nesse tópico foi:

em vez de:

Me.TableAdapterManager.UpdateAll(Me.DataSet)

utilizar:

Me.NOMEdaTABELATableAdapter.Update(Me.NOMEBaseDADOSDataSet.NOMEdaTABELA)

não resultou, continua a mesma historia :confused:

Share this post


Link to post
Share on other sites
MrGil

Sugeres então que mude de estratégia, ou seja que deixe os bindingsources e passe a fazer "à unha"?

Share this post


Link to post
Share on other sites
cdaniel.marques

Outra alternativa, fazeres "à unha" (citando) apenas o código para adicionar registo.

Assim mantinhas o código do form principal, apenas tinhas de carregar os novos dados quando fecho form para adicionar. (por ex., usando o código do form load, dependendo de como tiveres adaptado o código)

Edited by cdaniel.marques

Share this post


Link to post
Share on other sites
cdaniel.marques

cdaniel.marques, acontece a mesma coisa... a primeira entrada só é adicionada quando adiciono uma segunda e assim sucessivamente perdendo sempre informação...

Como adicionas-te un novo registo à base de dados, ser falta de carregar novamente os dados da base de dados.

Tens no wiki fornecido pelo bioshock, o seguinte código para actualizar:

Me.NOMEdaTABELATableAdapter.Fill(Me.NOMEBaseDADOSDataSet.NOMEdaTABELA)

para carregar novamente a base de dados com os novos dados.

Edited by cdaniel.marques

Share this post


Link to post
Share on other sites
bioshock

Sugeres então que mude de estratégia, ou seja que deixe os bindingsources e passe a fazer "à unha"?

Sim. É muito, muito melhor.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • 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.