none
problema em fazer multiplos selects RRS feed

  • Pergunta

  • Prezados,

    Estou precisando da vossa ajuda. O problema é o seguinte:
    - Tenho uma aplicação (nesta aplicação tenho um textbox, suas labels - lblNome e lblAccao) que controla uma torniquete (catraca)... o utilizador vem, passa o seu cartão no leitor de barra e o software encarregado, primeiro, de ver se este utilizador existe ou não... se o utilizador não existe, no lblname deve aparecer 'Utilizador Não Encontrado' e na lblAccao 'Acesso Negado'.... Se existe então percorremos noutra tabela, a tabela de horários, pois o utilizador só está permitido a entrar no seu horario... ou seja, e verifica-se se está a entrar no seu respectivo horario. caso sim, a torniquete abre e imprime na lblNome o seu nome completo e na lblAccao ' acesso negado', .... até aqui está tudo bem.... mas este utilizador está registado mas não não está no seu horario, aqui já não consigo imprimir o seu nome....

    vou postar o código e o erro que recebo:

    Private Sub txtCardNum_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCardNum.KeyPress
            If Char.IsNumber(e.KeyChar) Or e.KeyChar = Chr(13) Or e.KeyChar = Chr(8) Then
                e.Handled = False
                If e.KeyChar = Chr(13) Then
                    ' Se a tecla enter for pressionada...
                    If txtCardNum.Text = "" Then
                        MsgBox("Digite um Número Válido")
                    ElseIf txtCardNum.Text.Length() < 2 Or txtCardNum.Text.Length() = 2 Then
                        MsgBox("Digite um Número Válido")
                    Else
                        Dim NumeroDigitado As String = txtCardNum.Text
                        Dim NumeroCliente As Integer
                        Dim NumeroPorta As Integer
    
                        NumeroCliente = NumeroDigitado.Remove(NumeroDigitado.Length - 1, 1)
                        NumeroPorta = NumeroDigitado.Substring(NumeroDigitado.Length - 1, 1)
    
                        Dim SQL As String
                        SQL = "SELECT U.CodEntidade, U.NomeEntidade, U.DataCria FROM AFENTIDADE U INNER JOIN AGFICMOV A ON U.CodEntidade = A.CodEntidade WHERE A.DataInicio <= GETDATE() AND A.DataFim >= GETDATE() AND A.Estado = 'A' AND A.CodEntidade = @CodEntidade SELECT NomeEntidade FROM AFENTIDADE WHERE CodEntidade = @CodEntidade"
                        Dim myCommand = New SqlCommand(SQL, myConnection)
                        myCommand.Parameters.Add("@CodEntidade", SqlDbType.VarChar).Value = NumeroCliente
    
                        Dim SQL2 As String
                        SQL2 = "SELECT NomeEntidade, DataCria FROM AFENTIDADE WHERE CodEntidade = @CodEntidade"
                        Dim myCommand2 = New SqlCommand(SQL2, myConnection)
                        myCommand2.Parameters.Add("@CodEntidade", SqlDbType.VarChar).Value = NumeroCliente
    
                        Dim reader As SqlDataReader = myCommand.ExecuteReader()
                        'Caso existam linhas
                        If reader.HasRows Then
                            While reader.Read()
                                lblNomeCliente.Text = reader(1)
                                lblDataRegisto.Text = reader(2)
    
                                If NumeroPorta = "01" Then
                                    Timer2.Enabled = True
                                    Timer2.Interval = 500
                                    lblInfoAcesso.Text = "SEJA BEM-VINDO!"
                                    Me.txtMonitor.Text = Me.txtMonitor.Text & vbCrLf & "[" & Date.Now.ToString & "] - Entrada Permitida para o Associado Número: " & NumeroCliente
    
    
                                    ' Abrir a Porta de Entrada...
                                    ' ...
                                Else
                                    Timer2.Enabled = True
                                    Timer2.Interval = 500
                                    lblInfoAcesso.Text = "OBRIGADO PELA VISITA. VOLTE SEMPRE!"
                                    Me.txtMonitor.Text = Me.txtMonitor.Text & vbCrLf & "[" & Date.Now.ToString & "] - Saída Permitida para o Associado Número: " & NumeroCliente
    
    
                                    ' Abrir a Porta de Saída
                                    ' ...
                                End If
    
                                txtCardNum.Text = ""
    
    
    
                            End While
                            reader.Close()
                        Else
                            lblNomeCliente.Text = reader(1)
                            lblInfoAcesso.Text = "Acesso Negado"
                            txtCardNum.Text = ""
                        End If
                    End If
                End If
            Else
                e.Handled = True
            End If
    
        End Sub


    quando tento executar este código, surge o seguinte erro:



    alterar a última parte do código e ficou assim:

    ...   
    End While
                            reader.Close()
                        Else
                            Dim reader2 As SqlDataReader = myCommand2.ExecuteReader()
                            lblNomeCliente.Text = reader2(1)
                            lblInfoAcesso.Text = "Acesso Negado"
                            txtCardNum.Text = ""
                        End If
                    End If
                End If
            Else
                e.Handled = True
            End If
    
        End Sub
    
    

    mas agora dá outro erro:



    como podem ver na imagem, eu fechou o promeiro data reader, mas continua a dizer que o datareader associado ao comando está aberto...

    o que está errado neste código... como resolvo isso...

    cumps
    PS
    sexta-feira, 22 de janeiro de 2010 08:35

Respostas

  • Olá Patrício blz?

    Você está fechando o reader caso a reader.hasrows = true, mas não está fechando caso nao tenha linhas

    inclua mais uma linha no seu else

                        Else
                            reader.Close()
                            Dim reader2 As SqlDataReader = myCommand2.ExecuteReader()
                            lblNomeCliente.Text = reader2(1)
                            lblInfoAcesso.Text = "Acesso Negado"
                            txtCardNum.Text = ""

    Espero ter ajudado.

    Att. Alan.
    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
    sexta-feira, 22 de janeiro de 2010 10:53