Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

passado

Acesso a BD e ciclo While

Mensagens Recomendadas

passado    0
passado

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

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).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
passado    0
passado

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
passado    0
passado

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gooden    0
Gooden

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
passado    0
passado

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

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 a nossa Política de Privacidade