• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

passado

Acesso a BD e ciclo While

20 mensagens neste tópico

boas pessoal eu uso o código seguinte para fazer uma buscar na BD para ver se já existem nomes igual, se existirem e lançado um errorprovider, mas nada que impeça o registo de ser guardado pois funciona só como alerta o codigo que construi para esse efeito e o seguinte:

Private Sub NomeTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles NomeTextBox.Validating
        'teste de nome
        Dim strConn As String = My.Settings.aluguerConnectionString.ToString()
        Dim strSQL As String = "Select nome from Clientes"
        Dim dr As SqlDataReader

        'define objeto connection e command
        Dim con As New SqlConnection(strConn)
        Dim cmd As New SqlCommand(strSQL, con)
        Try
            con.Open()
            dr = cmd.ExecuteReader
            If (dr.HasRows) Then
                dr.Read()
                Do While dr.Read
                    a = dr("nome").ToString
                    If a = NomeTextBox.Text Then
                        ErrorProvider1.SetError(NomeTextBox, "Já existe um cliente com o nome: " & NomeTextBox.Text & Chr(13) & "Verifique se corresponde ao mesmo cliente")
                    Else
                        ErrorProvider1.Clear()
                    End If
                Loop

            End If
        Catch ex As Exception
            MsgBox("Erro ao obter dados. Erro : " & ex.Message)
        Finally
            con.Close()
        End Try
    End Sub

 

Acontece que todos os registos sao conhecidos menos o primeiros por exemplo:

1 registo = Luis

2 registo = Rui

3 registo = Zé

Se eu na textbox escrever "Luis" o errorprovder nao funciona, mas se escrever "Rui" ou "Zé" já funciona

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas pessoal eu uso o código seguinte para fazer uma buscar na BD para ver se já existem nomes igual, se existirem e lançado um errorprovider, mas nada que impeça o registo de ser guardado pois funciona só como alerta o codigo que construi para esse efeito e o seguinte:

Private Sub NomeTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles NomeTextBox.Validating
        'teste de nome
        Dim strConn As String = My.Settings.aluguerConnectionString.ToString()
        Dim strSQL As String = "Select nome from Clientes"
        Dim dr As SqlDataReader

        'define objeto connection e command
        Dim con As New SqlConnection(strConn)
        Dim cmd As New SqlCommand(strSQL, con)
        Try
            con.Open()
            dr = cmd.ExecuteReader
            If (dr.HasRows) Then
                dr.Read()
                Do While dr.Read
                    a = dr("nome").ToString
                    If a = NomeTextBox.Text Then
                        ErrorProvider1.SetError(NomeTextBox, "Já existe um cliente com o nome: " & NomeTextBox.Text & Chr(13) & "Verifique se corresponde ao mesmo cliente")
                    Else
                        ErrorProvider1.Clear()
                    End If
                Loop

            End If
        Catch ex As Exception
            MsgBox("Erro ao obter dados. Erro : " & ex.Message)
        Finally
            con.Close()
        End Try
    End Sub

 

Acontece que todos os registos sao conhecidos menos o primeiros por exemplo:

1 registo = Luis

2 registo = Rui

3 registo = Zé

Se eu na textbox escrever "Luis" o errorprovder nao funciona, mas se escrever "Rui" ou "Zé" já funciona

Experimenta apagar dali o dr.Read() (a linha que coloquei em destaque na citação).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu costumo usar assim, ora vê lá se faz algo diferente:

Private Sub NomeTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles NomeTextBox.Validating
        'teste de nome
        Dim strConn As String = My.Settings.aluguerConnectionString.ToString()
        Dim strSQL As String = "Select nome from Clientes"
        Dim dr As SqlDataReader

        'define objeto connection e command
        Dim con As New SqlConnection(strConn)
        Dim cmd As New SqlCommand(strSQL, con)
        Try
            con.Open()
            dr = cmd.ExecuteReader
            If (dr.HasRows) Then
                dr.Read()
                While dr.Read() 
                        If dr("nome").ToString = NomeTextBox.Text Then
                        ErrorProvider1.SetError(NomeTextBox, "Já existe um cliente com o nome: " & NomeTextBox.Text & Chr(13) & "Verifique se corresponde ao mesmo cliente")
                    Else
                        ErrorProvider1.Clear()
                    End If
                End while
            End If
        Catch ex As Exception
            MsgBox("Erro ao obter dados. Erro : " & ex.Message)
        Finally
            con.Close()
        End Try
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e se tirares o dr.read() que tens antes do while? ele assim acho que lê 2 vezes daí o passar para o 2ª registo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aí tem de haver gato, tens mesmo "Luis" no primeiro registo?!

E realmente nem tinha reparado, eu copiei e ajustei o teu code e esqueci-me de apagar o dr.Read(), é assim que deveria ter ficado:

Private Sub NomeTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles NomeTextBox.Validating
        'teste de nome
        Dim strConn As String = My.Settings.aluguerConnectionString.ToString()
        Dim strSQL As String = "Select nome from Clientes"
        Dim dr As SqlDataReader

        'define objeto connection e command
        Dim con As New SqlConnection(strConn)
        Dim cmd As New SqlCommand(strSQL, con)
        Try
            con.Open()
            dr = cmd.ExecuteReader
            If (dr.HasRows) Then
                  While dr.Read()
                        If dr("nome").ToString = NomeTextBox.Text Then
                        ErrorProvider1.SetError(NomeTextBox, "Já existe um cliente com o nome: " & NomeTextBox.Text & Chr(13) & "Verifique se corresponde ao mesmo cliente")
                    Else
                        ErrorProvider1.Clear()
                    End If
                End while
            End If
        Catch ex As Exception
            MsgBox("Erro ao obter dados. Erro : " & ex.Message)
        Finally
            con.Close()
        End Try
    End Sub

mete um Break na linha que está destacada e verifica os valores que o dr.item() assume

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O dr.item nao devolve nenhum valor quere quando funciona quere quando nao funciona, ja copiei o texto do primeiro registo em "nome" e colei na textbox e continua a nao funcionar, e quando pesquiso por este ele corre o while duas vezes....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Devo estar a dormir, só agora reparei que tens dr("nome"), não deveria ser dr.Item("nome") ? É assim que uso sempre.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acontece precisamente o mesmo e o item nao me devolve nada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem coloquei uma msgbox dentro do while a devolver os valores que encontra

While dr.Read()
                    MsgBox(dr.Item("nome").ToString)
                End While

E não é que me devolveu os dois registos que la tenho o "Luis", que é o primeiro, e o "Rui" que é o segundo

Porque raiu o errorprovider nao funciona?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alguem me consegue resolver isto, tenho tentado tudo e nao descubro o porque

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se o dr nao devolve nada e pk ele nao esta a ler nada da base de dados..quanto mais comparar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu ja fui a BD copiei o que la esta, colei no campo e nao dá nada, mas isso so me acontece no primeiro registo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tenta assim

        Dim strConn As String = My.Settings.aluguerConnectionString.ToString()
        Dim con As New SqlConnection(strConn)
        Dim strSQL As String = "Select nome from Clientes"
        Dim dr As SqlDataAdapter = New SqlDataAdapter(strSQL, con)
        Dim ds As New DataSet
        dr.Fill(ds)
        Try
            If ds.Tables(0).Rows.Count <> 0 Then
                Dim r As DataRow
                For Each r In ds.Tables(0).Rows
                    If r("nome").ToString = NomeTextBox.Text Then
                        ErrorProvider1.SetError(NomeTextBox, "Já existe um cliente com o nome: " & NomeTextBox.Text & Chr(13) & "Verifique se corresponde ao mesmo cliente")
                    Else
                        ErrorProvider1.Clear()
                    End If
                Next

            End If
        Catch ex As Exception
            MsgBox("Erro ao obter dados. Erro : " & ex.Message)
        Finally
            con.Close()
        End Try

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não dá....

E mesmo como eu tinha, agora so me reconhece o ultimo registo, sendo que eu adicionei alguns ou seija de 5 registo só reconhece 1

0

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