Ir para o conteúdo
pedromartins

Problema com access e vb2010

Mensagens Recomendadas

pedromartins

Boas Pessoal, tenho tido um problemazito num codigo que aparenta ser fácil, isto é assim, o que estou a tentar fazer por agora e um login system, mas estou a ter um erro no operador '>=1' será que me podem ajudar?

Aqui esta o codigo:

Dim Tabela As String = "utilizadores"
        Dim query As String = "SELECT * FROM " & Tabela & " WHERE username = '" & txtusername.Text & "' and password = '" & txtpassword.Text & "'"
        Dim caminhoconexao As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\loja.accdb"
        Dim ds As New DataSet
        Dim conexao As OleDbConnection = New OleDbConnection(caminhoconexao)
        Dim comando As New OleDbCommand(query, conexao)
        Dim da As New OleDbDataAdapter(comando)
        Try
            conexao.Open()
            comando.CommandType = CommandType.Text
            comando.CommandText = "SELECT * FROM " & Tabela & " WHERE username = '" & txtusername.Text & "' and password = '" & txtpassword.Text & "'"
            comando.ExecuteNonQuery()
            If comando.ExecuteScalar >= 1 Then
                Me.Close()
                Form2.Show()
            Else
                MsgBox("Username ou Password errados, tente novamente", MsgBoxStyle.Information, "Aviso:")
            End If
            conexao.Close()
        Catch ex As Exception
            MsgBox("Erro: " & Err.Number & "-" & Err.Description)
End Sub

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jpaulino

O método ExecuteScalar() devolve um objecto que representa a primeira  linha da primeira coluna encontrada (que neste caso não é o que queres).

Utiliza em vez do ExecuteScalar() or ExecuteNonQuery(), ou seja:

comando.CommandType = CommandType.Text
comando.CommandText = "SELECT * FROM " & Tabela & " WHERE username = '" & txtusername.Text & "' and password = '" & txtpassword.Text & "'"
If comando.ExecuteNonQuery() >= 1 Then

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renafi

Ou então deixa o ExecuteScalar e muda a instrução para: "select count(*) from ....."


Oracle Certified Professional - AdministraçãoOracle Certified Professional - Pl/sqlMCPD - Microsoft Certified Professional DeveloperMCTS - Microsoft Certified Technology Specialist

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

O método ExecuteScalar() devolve um objecto que representa a primeira  linha da primeira coluna encontrada (que neste caso não é o que queres).

Utiliza em vez do ExecuteScalar() or ExecuteNonQuery(), ou seja:

comando.CommandType = CommandType.Text
comando.CommandText = "SELECT * FROM " & Tabela & " WHERE username = '" & txtusername.Text & "' and password = '" & txtpassword.Text & "'"
If comando.ExecuteNonQuery() >= 1 Then

Fiz como disseste mas o resultado que ele me da é que o username e a password estao errados e na base de dados estão correctos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PauloR

simplifica e verifica se as variáveis tabela,  username e password estão correctas...

        Dim caminhoconexao As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\loja.accdb"
Dim Tabela As String = "utilizadores"
        Dim query As String = "SELECT * FROM " & Tabela & " WHERE username = '" & txtusername.Text & "' and password = '" & txtpassword.Text & "'"

        Dim conexao  As New OleDbConnection(caminhoconexao)
        Dim comando  As New OleDbCommand(query, conexao)

        Try
            conexao.Open()
            
	if comando.ExecuteNonQuery = 1 Then
		me.close()
		form2.show()
	else
		...
	end if

        Catch ex As Exception
	...

Finally 
	conexao.close()
	comando = Nothing

        End Try

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

simplifica e verifica se as variáveis tabela,  username e password estão correctas...

        Dim caminhoconexao As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\loja.accdb"
Dim Tabela As String = "utilizadores"
        Dim query As String = "SELECT * FROM " & Tabela & " WHERE username = '" & txtusername.Text & "' and password = '" & txtpassword.Text & "'"

        Dim conexao  As New OleDbConnection(caminhoconexao)
        Dim comando  As New OleDbCommand(query, conexao)

        Try
            conexao.Open()
            
	if comando.ExecuteNonQuery = 1 Then
		me.close()
		form2.show()
	else
		...
	end if

        Catch ex As Exception
	...

Finally 
	conexao.close()
	comando = Nothing

        End Try

já verifiquei e através do vb realizei a query e a sintax que o vb me dá é a seguinte:

SELECT        username, [password]
FROM            utilizadores
WHERE        (username = 'admin') AND ([password] = '1234')

Já no codigo do programa fiz as alterações que indicaste :

 Dim caminhoconexao As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\loja.accdb"
        Dim Tabela As String = "utilizadores"
        Dim query As String = "SELECT username, [password] FROM (utilizadores) WHERE (username = '" & txtusername.Text & "') AND ([password] = '" & txtpassword.Text & "')"
        Dim conexao As OleDbConnection = New OleDbConnection(caminhoconexao)
        Dim comando As New OleDbCommand(query, conexao)
        Try
            conexao.Open()
            If comando.ExecuteNonQuery() >= 1 Then
                Me.Close()
                Form2.Show()
            Else
                MsgBox("Username ou Password errados, tente novamente", MsgBoxStyle.Information, "Aviso:")
            End If
        Catch ex As Exception
            MsgBox("Erro: " & Err.Number & "-" & Err.Description)
        Finally
            conexao.Close()
            comando = Nothing
        End Try

Mesmo assim o erro persiste

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

Quando te apetecer, lê o meu último post.

bioshock eu li, mas eu não percebi lá muito o que lá estava, pois no curso onde estou não aprendi com aqueles comandos mas sim com estes que estou a usar x: se me puderes dar umas luzes agradecia-te

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

bioshock eu li, mas eu não percebi lá muito o que lá estava, pois no curso onde estou não aprendi com aqueles comandos mas sim com estes que estou a usar x: se me puderes dar umas luzes agradecia-te

Pronto, podias-me ter dito logo isso, escusavas de ter ignorado.

Antes devo te dizer que essa tua query está errada. Tu queres seleccionar o username e não o username + password. O que te interessa saber é se o username está lá com a X situação, onde X = password.

Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\loja.accdb")
Dim query As String = "SELECT username FROM Tabela WHERE username = @user AND password = @pass"
Dim command As New OleDbCommand(query, connection)
command.Parameters.Add("@user", OleDbType.VarChar).Value = txtusername.Text
command.Parameters.Add("@pass", OleDbType.VarChar).Value = txtpassword.Text
connection.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
   If reader.HasRows Then
            MsgBox("Bem vindo!")
        Else
            MsgBox("Wrong user or pw!")
   End If
connection.Close()

Também podes ver este tópico: http://wiki.portugal-a-programar.org/dev_net:vb.net:poptextbox

Se não perceberes algum comando diz, não fiques na ignorância.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

Pronto, podias-me ter dito logo isso, escusavas de ter ignorado.

Antes devo te dizer que essa tua query está errada. Tu queres seleccionar o username e não o username + password. O que te interessa saber é se o username está lá com a X situação, onde X = password.

Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\loja.accdb")
Dim query As String = "SELECT username FROM Tabela WHERE username = @user AND password = @pass"
Dim command As New OleDbCommand(query, connection)
command.Parameters.Add("@user", OleDbType.VarChar).Value = txtusername.Text
command.Parameters.Add("@pass", OleDbType.VarChar).Value = txtpassword.Text
connection.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
   If reader.HasRows Then
            MsgBox("Bem vindo!")
        Else
            MsgBox("Wrong user or pw!")
   End If
connection.Close()

Também podes ver este tópico: http://wiki.portugal-a-programar.org/dev_net:vb.net:poptextbox

Se não perceberes algum comando diz, não fiques na ignorância.

Só não entendi o "@user" e o "@pass" o resto cheguei lá xD

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

No @user e no @pass podia estar @alface e @bife..desde que depois também alterasses nos parâmetros. Serve para fazeres queries seguras de injections ou outro tipo de problemas futuros.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

mas aquilo tem algum significado especial, não sei o que é que aquilo faz, se grava o que esta na base de dados ou alguma cena parecida

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

Neste caso guardam o valor que tu lhe estas a indicar, neste caso é o valor da TextBox txtusername e txtpassword.


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

Queria só saber mais uma coisinha, se posso usar as variaveis "@user" e "@pass" para saber qual das informações que o utilizador introduziu mal, para nao dizer user/pass erradas, dizer apenas qual esta errado, se for esse o caso.

tentei algo do genero mas parece nao resultar

If reader.Item("username") <> txtusername.Text Then
            MsgBox("Utilizador errado")
            connection.Close()

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

Tentei dessa maneira mas não deu, diz que estao ambas erradas quando uma esta certa x:

If reader.HasRows Then
            Me.Hide()
            registarfrm.Show()
        Else
            If command.Parameters.Add("@user", OleDbType.VarChar).Value <> txtusername.Text Then
                MsgBox("Utilizador errado ou inexistente, confira ou registe-se!", MsgBoxStyle.Information, "Aviso:")
            End If
            If command.Parameters.Add("@pass", OleDbType.VarChar).Value <> txtpassword.Text Then
                MsgBox("Password errada, confira", MsgBoxStyle.Information, "Aviso:")
                txtpassword.Focus()
            End If

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

A consulta que estas a fazer so retorna dados se ambos os campos estiverem correctamente preenchidos.


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedromartins

Ou seja devia de ter uma query so a seleccionar o user e a pass certo?

 If reader.HasRows Then
            Me.Hide()
            registarfrm.Show()
        Else
            query = "SELECT username, password FROM " & tabela & ""

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PauloR

Podes fazer tudo só com um select ...

Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\loja.accdb")
Dim query As String = "SELECT username, password FROM Tabela WHERE username = @user"
Dim command As New OleDbCommand(query, connection)
command.Parameters.Add("@user", OleDbType.VarChar).Value = txtusername.Text
'command.Parameters.Add("@pass", OleDbType.VarChar).Value = txtpassword.Text
connection.Open()

Dim reader As OleDbDataReader = command.ExecuteReader()
   If reader.HasRows Then
'Existe um utilizador com este username, verifica agora a password
' como o select traz o username e password reader(0) = username, reader(1) = password 
if reader(1)=txtpassword.text
	'password está correcta podes continuar
        MsgBox("Bem vindo!")
else
	'password errada
	msgbox ("password errada")
end if
   Else
'não existe utilizador não precisas de verificar a password
        MsgBox("Wrong user")
   End If

connection.Close()

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Não. Na query que eu te coloquei o que te interessa é seleccionar o username consoante o username e password inseridos. Mas se também pretendes devolver a password (má prática) podes seleccionar o username e password.

Edit: @PauloR: isso é extremamente incorrecto. Dessa forma, eu chegava à Textbox, inseria um username à sorte e apanhava a password do gajo..muito bom!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

Ou seja devia de ter uma query so a seleccionar o user e a pass certo?

 If reader.HasRows Then
            Me.Hide()
            registarfrm.Show()
        Else
            query = "SELECT username, password FROM " & tabela & ""

Sim, é mais ou menos isso. A query que deves fazer é para o utilizador selecionado, se não retornar nenhum registo é porque o o registo não está efectuado, se retornar é porque a pass não está correcta.


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação 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 os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.