SELECT RETORNA INCORRETO

SANROMAN 27/06/2017 21:40:39
#474793
Boa amigos,

Estou tentando entender porque um select retorna um valor que não condiz com a realidade.

Tenho dois campos nome e senha

No BD nome = San, senha = 010203

Uso o seguinte código para esse select

Private Function logar(strUsuario As String, strSenha As String) As Boolean

Using con As FbConnection = conectarFirebird()

con.Open()

Dim strCom As String = [Ô]SELECT Login, Senha [Ô] & _
[Ô]FROM tbLogin [Ô] & _
[Ô]WHERE Login = [ô][Ô] + strUsuario.Trim() + [Ô][ô][Ô] & _
[Ô]AND Senha = [ô][Ô] + strSenha.Trim() + [Ô][ô][Ô]

Dim sqlCom As New FbCommand(strCom, con)
Dim dr As FbDataReader
dr = sqlCom.ExecuteReader
dr.Read()

If strUsuario.Trim([Ô][Ô], [Ô][ô][Ô]).Length > 0 And strSenha.Trim([Ô][Ô], [Ô][ô][Ô]).Length > 0 Then
Try
If dr.HasRows Then
Return True
Else
MsgBox([Ô]Senha ou usuário inválido.[Ô], MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
End If
Catch ex As Exception
MsgBox(ex.ToString)
Finally
con.Close()
End Try
Else
If cbNome.Text = String.Empty And txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
ElseIf cbNome.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
ElseIf txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
End If
End If

Return False

End Using

End Function

Se passo o valor para usuário = San e senha = 01 essa consulta retorna verdadeiro, mas na verdade a consulta deve retornar falsa pois senha = 01 não condiz com o valor do campo no BD.
Não consigo enxergar aonde estou errando na construção dessa consulta.



JABA 27/06/2017 22:43:10
#474798
Quando você utiliza o [txt-color=#0000f0]Using[/txt-color], não é necessário fechar o banco explicitamente, ele já faz isso pra você. Talvez o problema esteja aí. Elimine a seguinte parte do código e faça o teste:

Finally
con.Close()
SANROMAN 27/06/2017 22:47:26
#474800
Boa noite JABA

A mesma coisa, não importa o valor que inserido no campo senha, sempre dá TRUE sendo verdade ou não
Não entendo.
KERPLUNK 27/06/2017 22:57:16
#474803
Resposta escolhida
1 - Use parâmetros, não concatenação. Já de cara vejo um erro de falta de um espaço. Veja se acha onde está...
2 - A sanitização deve ser feita ANTES de qualquer operação com o banco de dados.
3 - Já que você não está retornando os dados do FbDataReader, não faz sentido usar uma query que não uma contagem.
4 - O FbCommand e FbDataReader, ambos implementam IDisposable, portanto deveriam ter seus próprios blocos using
SANROMAN 27/06/2017 23:07:30
#474806
Boa noite KERPLUNK

Já achei o espaço que faltava, mesmo assim continua dando verdadeiro para qualquer valor inserido no campo senha.

Etsou migrando para o banco de dados firebird e tenho a mesma consulta em sql server e funciona perfeitamente.

Não entendo.
JABA 27/06/2017 23:12:59
#474807
Depure o seu código com F10 e veja o que está vindo no seu dr (DataReader). Se dá sempre true é porque ele está sempre com dados.

 If dr.HasRows Then
Return True
SANROMAN 28/06/2017 00:11:48
#474809
JABA

Ainda não consegui resolver isso. Sei lá como pode.
Não acho erro no código.
Vou dar uma parada, quem sabe amanhã não achamos uma solução.

Boa noite.
COQUITO 28/06/2017 04:53:47
#474811
Citação:

:
Boa amigos,

Estou tentando entender porque um select retorna um valor que não condiz com a realidade.

Tenho dois campos nome e senha

No BD nome = San, senha = 010203

Uso o seguinte código para esse select

Private Function logar(strUsuario As String, strSenha As String) As Boolean

Using con As FbConnection = conectarFirebird()

con.Open()

Dim strCom As String = [Ô]SELECT Login, Senha [Ô] & _
[Ô]FROM tbLogin [Ô] & _
[Ô]WHERE Login = [ô][Ô] + strUsuario.Trim() + [Ô][ô][Ô] & _
[Ô]AND Senha = [ô][Ô] + strSenha.Trim() + [Ô][ô][Ô]

Dim sqlCom As New FbCommand(strCom, con)
Dim dr As FbDataReader
dr = sqlCom.ExecuteReader
dr.Read()

If strUsuario.Trim([Ô][Ô], [Ô][ô][Ô]).Length > 0 And strSenha.Trim([Ô][Ô], [Ô][ô][Ô]).Length > 0 Then
Try
If dr.HasRows Then
Return True
Else
MsgBox([Ô]Senha ou usuário inválido.[Ô], MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
End If
Catch ex As Exception
MsgBox(ex.ToString)
Finally
con.Close()
End Try
Else
If cbNome.Text = String.Empty And txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
ElseIf cbNome.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
ElseIf txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
End If
End If

Return False

End Using

End Function

Se passo o valor para usuário = San e senha = 01 essa consulta retorna verdadeiro, mas na verdade a consulta deve retornar falsa pois senha = 01 não condiz com o valor do campo no BD.
Não consigo enxergar aonde estou errando na construção dessa consulta.






brother não sei se esse código está tipo GAMBIARRA rsrs. não consegui entender muito bem pq vc declara um String de consulta e tenta [Ô]&[Ô] de vc pode chamar o mesmo string na sequenencia, exemplo sql+=[Ô]Where.......[Ô]
outra coisa não consigo saber qual é a finalidade de vc o return true apos declarar rowshas, o que vc esta falando asssim quero linhas em true, não faz sentido, mas vou disponibilizar meu código pra vc dar uma estudada.
Citação:

Private Sub Entrada_usuario()

Using cn As SqlConnection = Conectar_BancoDados()
Dim dr As SqlDataReader = Nothing

Try
cn.Open()
Dim cmd As New SqlCommand
cmd.CommandText = [Ô]SELECT * from tab_usuarios where Login_usuario=[ô][Ô] + Login_usuarioTextBox.Text + [Ô][ô] And Senha_usuario=[ô][Ô] + Senha_usuarioTextBox.Text + [Ô][ô][Ô]
cmd.Connection = cn
dr = cmd.ExecuteReader()

If (dr.HasRows) Then
dr.Read()

IntCodigoUsuario = CType(dr.Item([Ô]cod_usuario[Ô]), Integer)
StrLoginUsuario = CType(dr.Item([Ô]login_usuario[Ô]), String)
msg([Ô]acesso autorizado[Ô])
Me.Hide()
My.Forms.frmTelaMenuInicial.ShowDialog()
Else
msg([Ô]acesso nao autorizado, senha ou login incorretos[Ô])
Senha_usuarioTextBox.Clear()
Senha_usuarioTextBox.Focus()

End If
End If
Catch ex As Exception
MsgBox(ex.Message)
Finally
cn.Close()
End Try
End Using

End Sub

SANROMAN 28/06/2017 13:55:58
#474833
Bom dia COQUITO

Usei seu exemplo e continuou retornando TRUE

Ai sim, com uma gambiarra resolvi, segue o código:

Private Sub logar()

Using con As FbConnection = conectarFirebird()

Dim dr As FbDataReader

Try

con.Open()

Dim sqlCom As New FbCommand
sqlCom.CommandText = [Ô]SELECT * [Ô] & _
[Ô]FROM tbLogin [Ô] & _
[Ô]WHERE Login = [ô][Ô] + cbNome.Text + [Ô][ô] [Ô] & _
[Ô]AND Senha = [ô][Ô] + txtSenha.Text + [Ô][ô] [Ô]

sqlCom.Connection = con
dr = sqlCom.ExecuteReader


If cbNome.Text = String.Empty Or txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.Text = String.Empty
txtSenha.Text = String.Empty
txtNome.Text = String.Empty
cbNome.Focus()
Else
If dr.HasRows Then
dr.Read()
frmPrincipal.txtTitular.Text = dr([Ô]Nome[Ô]).ToString
MsgBox([Ô]Acesso autorizado.[Ô], MsgBoxStyle.Information + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
frmFundo.Hide()
Me.Hide()
frmPrincipal.ShowDialog()
End If

End If

Catch ex As Exception
[txt-color=#e80000] MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.Text = String.Empty
txtSenha.Text = String.Empty
txtNome.Text = String.Empty
cbNome.Focus()
[/txt-color] End Try

End Using

End Sub

Nas exceções coloquei o código acima em vermelho.

Certo ou errado agora está funcionando.

O mais engraçado é que o mesmo código postado no inicio do tópico - [txt-color=#0000f0]Private Function logar(strUsuario As String, strSenha As String) As Boolean...[/txt-color] - usando sql server funciona perfeitamente

Se tiverem alguma ressalva para minha solução sintam-se a vontade para opinar
COQUITO 28/06/2017 14:11:37
#474835
Citação:

:
Bom dia COQUITO

Usei seu exemplo e continuou retornando TRUE

Ai sim, com uma gambiarra resolvi, segue o código:

Private Sub logar()

Using con As FbConnection = conectarFirebird()

Dim dr As FbDataReader

Try

con.Open()

Dim sqlCom As New FbCommand
sqlCom.CommandText = [Ô]SELECT * [Ô] & _
[Ô]FROM tbLogin [Ô] & _
[Ô]WHERE Login = [ô][Ô] + cbNome.Text + [Ô][ô] [Ô] & _
[Ô]AND Senha = [ô][Ô] + txtSenha.Text + [Ô][ô] [Ô]

sqlCom.Connection = con
dr = sqlCom.ExecuteReader


If cbNome.Text = String.Empty Or txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.Text = String.Empty
txtSenha.Text = String.Empty
txtNome.Text = String.Empty
cbNome.Focus()
Else
If dr.HasRows Then
dr.Read()
frmPrincipal.txtTitular.Text = dr([Ô]Nome[Ô]).ToString
MsgBox([Ô]Acesso autorizado.[Ô], MsgBoxStyle.Information + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
frmFundo.Hide()
Me.Hide()
frmPrincipal.ShowDialog()
End If

End If

Catch ex As Exception
[txt-color=#e80000] MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.Text = String.Empty
txtSenha.Text = String.Empty
txtNome.Text = String.Empty
cbNome.Focus()
[/txt-color] End Try

End Using

End Sub

Nas exceções coloquei o código acima em vermelho.

Certo ou errado agora está funcionando.

O mais engraçado é que o mesmo código postado no inicio do tópico - [txt-color=#0000f0]Private Function logar(strUsuario As String, strSenha As String) As Boolean...[/txt-color] - usando sql server funciona perfeitamente

Se tiverem alguma ressalva para minha solução sintam-se a vontade para opinar





bom o que seria melhor vc usar o blackpoint e verificar paso a paso mas agora que percebo vc chama dentro da conexao uma validação de campos isso tambem pode ser que este dando esse erro e nao use muito o string.empaty isso atrapalha as vezes

Citação:

Private Sub logar()

Using con As FbConnection = conectarFirebird()

Dim dr As FbDataReader

Try

con.Open()

Dim sqlCom As New FbCommand
sqlCom.CommandText = [Ô]SELECT * [Ô] & _
[Ô]FROM tbLogin [Ô] & _
[Ô]WHERE Login = [ô][Ô] + cbNome.Text + [Ô][ô] [Ô] & _
[Ô]AND Senha = [ô][Ô] + txtSenha.Text + [Ô][ô] [Ô]

sqlCom.Connection = con
dr = sqlCom.ExecuteReader


[txt-color=#e80000] If cbNome.Text = String.Empty Or txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.Text = String.Empty
txtSenha.Text = String.Empty
txtNome.Text = String.Empty
cbNome.Focus()
Else[/txt-color]
If dr.HasRows Then
dr.Read()
frmPrincipal.txtTitular.Text = dr([Ô]Nome[Ô]).ToString
MsgBox([Ô]Acesso autorizado.[Ô], MsgBoxStyle.Information + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
frmFundo.Hide()
Me.Hide()
frmPrincipal.ShowDialog()
End If

End If

Catch ex As Exception
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.Text = String.Empty
txtSenha.Text = String.Empty
txtNome.Text = String.Empty
cbNome.Focus()
End Try

End Using

End Sub



tente alterar dessa forma assim

Private Sub logar()

Using con As FbConnection = conectarFirebird()

Dim dr As FbDataReader

Try

con.Open()
If cbNome.Text = [Ô][Ô] Or txtSenha.Text = [Ô][Ô] Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.clear
txtSenha.clear
txtNome.clear
cbNome.Focus()
Else
Dim sqlCom As New FbCommand
sqlCom.CommandText = [Ô]SELECT * [Ô] & _
[Ô]FROM tbLogin [Ô] & _
[Ô]WHERE Login = [ô][Ô] + cbNome.Text + [Ô][ô] [Ô] & _
[Ô]AND Senha = [ô][Ô] + txtSenha.Text + [Ô][ô] [Ô]

sqlCom.Connection = con
dr = sqlCom.ExecuteReader


If dr.HasRows Then
dr.Read()
frmPrincipal.txtTitular.Text = dr([Ô]Nome[Ô]).ToString
MsgBox([Ô]Acesso autorizado.[Ô], MsgBoxStyle.Information + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
frmFundo.Hide()
Me.Hide()
frmPrincipal.ShowDialog()
else
MsgBox([Ô]Acesso nao autorizado.[Ô], MsgBoxStyle.Information + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
End If

end if
Catch ex As Exception
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - LOGIN[Ô])
cbNome.Text = String.Empty
txtSenha.Text = String.Empty
txtNome.Text = String.Empty
cbNome.Focus()
End Try

End Using

End Sub

SANROMAN 28/06/2017 14:38:18
#474837
COQUITO

Dá na mesma.

Não resolvemos o problema, só achamos uma solução que espero que não dê problema.

Continua retornando TRUE sendo o valor do campo senha igual ou não do campo reistrado no BD Firebird.

No sql Server funciona sem essa gambiarra, cara... vai entender, vou postar o código baseado em sql Server:

Private Function logar(usuario As String, senha As String) As Boolean

Using con As SqlConnection = conectarDados()

con.Open()

Dim strCmd As String = [Ô]SELECT * FROM tbLogin [Ô] & _
[Ô]WHERE Login = [ô][Ô] + usuario.Trim() + [Ô][ô][Ô] & _
[Ô]AND Senha = [ô][Ô] + senha.Trim() + [Ô][ô][Ô]

Dim cmd As New SqlCommand(strCmd, con)
Dim dr As SqlDataReader
dr = cmd.ExecuteReader

If usuario.Trim([Ô][Ô], [Ô][ô][Ô]).Length > 0 And senha.Trim([Ô][Ô], [Ô][ô][Ô]).Length > 0 Then
Try
If dr.HasRows Then

Return True
Else
MsgBox([Ô]Senha ou usuário inválido.[Ô], MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
End If
Catch ex As Exception
MsgBox(ex.ToString)
Finally
con.Close()
End Try
Else
If cbNome.Text = String.Empty And txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
ElseIf cbNome.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
ElseIf txtSenha.Text = String.Empty Then
MsgBox([Ô]Os dados não conferem.[Ô] + vbCrLf _
+ [Ô]Por favor, tente outra vez.[Ô],
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, [Ô]AI SOFT - Erro...[Ô])
End If
End If

Return False

End Using

End Function


Dá uma olhada e exatamente igual ao bd firebird só que usa comandos sql Server.

Página 1 de 2 [20 registro(s)]
Tópico encerrado , respostas não são mais permitidas