Jump to content

[Resolvido] Fazer login com base de dados


vascoc

Recommended Posts

Boas, tenho o seguinte form, com as seguintes características, e é um login, ele faz o login, mas só lê o primeiro campo da tabela Utilizadores... Onde está o meu erro ? Obrigado.

http://img560.imageshack.us/img560/1535/semttuloiee.jpg

Imports System.Data.SqlServerCe
Imports System.IO
Public Class Login
Dim conn As New SqlCeConnection()
Dim cmd As New SqlCeCommand()
Dim da As New SqlCeDataAdapter()
Dim ds As New DataSet()
Dim cb As New SqlCeCommandBuilder()
Dim tr As Integer
Private Sub cmdentrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdentrar.Click
 Try
	 conn = New SqlCeConnection(My.Settings.HOTEL_DBConnectionString)
	 cmd = New SqlCeCommand("SELECT * FROM Utilizadores ", conn)
	 da = New SqlCeDataAdapter(cmd)
	 ds = New DataSet()
	 With conn
		 If .State = ConnectionState.Open Then 'ta aberto
			 .Close() ' fechamos
		 End If
		 .Open() ' abrimos a conexao
	 End With
	 da.Fill(ds, "consulta")
	 cb = New SqlCeCommandBuilder(da)
 Catch ex As Exception
	 MessageBox.Show(ex.Message, "informação do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Error)
 End Try
 If txtuser.Text = ds.Tables("Consulta").Rows(0).Item(0) And txtpass.Text = ds.Tables("Consulta").Rows(0).Item(1) Then
	 Loading.Show()
	 Me.Close()
 Else
	 MsgBox("Dados incorretos", MsgBoxStyle.Critical)
	 ' MessageBox.Show(ex.Message, "informação do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Error)
 End If
End Sub

Tabela Utilizadores e campos. Com os dados do User aa eu consigo fazer login, com os outros não..

http://img209.imageshack.us/img209/5059/fffo.png

Edited by Caça
GeSHi
Link to comment
Share on other sites

Oi Vascoc.

O cmd deve ser:

cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User=@User and password=@password", conn)

Adiciona os parametros ao cmd e atribui-lhes os valores das textboxs

Testa se ds.Tables("Consulta").rows.count() <> 1

- se = 0 - user e/ou pass inválidos (não registado)

- se > 1 - existirão + 1 urilizadore com o mesmo user e pass

Já agora, a lógica da connection deve ser invertida - boa prática

With conn

If .State = ConnectionState.Close Then 'ta aberto

.Open() ' abrimos a conexao

End If

End With

Link to comment
Share on other sites

Obrigado pela resposta. Assim ?


Private Sub cmdentrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdentrar.Click
Try
conn = New SqlCeConnection(My.Settings.HOTEL_DBConnectionString)
cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User= '" & txtuser.Text & "'AND password = '" & txtpass.Text & "' ", conn)
da = New SqlCeDataAdapter(cmd)
ds = New DataSet()
With conn
If .State = ConnectionState.Closed Then 'ta aberto
.Open() ' abrimos a conexao
End If
End With
da.Fill(ds, "consulta")
cb = New SqlCeCommandBuilder(da)
Catch ex As Exception
MessageBox.Show(ex.Message, "informação do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
tr = ds.Tables("consulta").Rows.Count <> 1
If ds.Tables("Consulta").rows.count() = 0 Then
MsgBox("Dados incorretos", MsgBoxStyle.Critical)
End If
If ds.Tables("Consulta").rows.count() > 1 Then
Loading.show()
Me.close()

End If
End Sub
Edited by Caça
GeSHi
Link to comment
Share on other sites

Onde está & txtuser.Text & "'AND password

deve estar & txtuser.Text & "' AND password

Cuidado que se os textos tiverem plicas vai dar erro, aconselho que vejas o tópico seguinte:

http://www.portugal-a-programar.pt/topic/54515-duvida-listar-dados-do-sqlserver-para-datagridview/#entry464843

A lógica deve ser

if ds.Tables("consulta").Rows.Count=1 then

'encontrou 1 e 1 só registo

Loading.show()

Me.close()

else

MsgBox("Dados incorretos")

endif

Link to comment
Share on other sites

Obrigado por a ajuda do segundo esquema, na questão do erro estou a tratar disso.

Não consegui destinguir a diferença no seu exexmplo em relação a query, se fosse possivel explicar de novo..

A password é de números e letras, ou seja tem de ter plicas ?

cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User='" & txtuser.Text &"' AND password = '" & txtpass.Text & "' ", conn)
Link to comment
Share on other sites

Indiquei o exemplo porque é mais conveniente trabalhar com parâmetros do que com valores direta/ das textboxs para o SQL.

imagina que user = "vasco,c" ou que a password contém vírgula(s)

O comando sql que utilizas dará erro.

Se utilizares

cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User=@user AND password=@pass, conn)

já não dá.

Link to comment
Share on other sites

São parametros.

mandei o link para veres o funcionamento.

Uma das formas de fazer é:

cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User=@user AND password=@pass", conn)

cmd.parameters.addwithvalue(@user, txtuser.Text)

cmd.parameters.addwithvalue(@pass, txtpass.Text)

.....

isto evita problemas com plicas e virgulas.

O sql utiliza a plica como delimitador de valores de texto (strings) e a virgula como separador de atributos/campos

Repara que quando constrois um comando de Sql através da concatenação de strings corres o risco de introduzir plicas ou virgulas indesejadas.

Link to comment
Share on other sites

Ficaria assim então ? Ainda falta qualquer coisa..

Try
	 conn = New SqlCeConnection(My.Settings.HOTEL_DBConnectionString)
	 cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User=@user AND password=@pass", conn)
	 cmd.parameters.addwithvalue(@user, txtuser.Text)
cmd.parameters.addwithvalue(@pass, txtpass.Text)
	 da = New SqlCeDataAdapter(cmd)
	 ds = New DataSet()
	 With conn
		 If .State = ConnectionState.Closed Then 'ta aberto
			 .Open() ' abrimos a conexao
		 End If
	 End With
	 da.Fill(ds, "consulta")
	 cb = New SqlCeCommandBuilder(da)
 Catch ex As Exception
	 MessageBox.Show(ex.Message, "informação do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Error)
 End Try
 tr = ds.Tables("consulta").Rows.Count <> 1
 If ds.Tables("consulta").Rows.Count = 1 Then
	 'encontrou 1 e 1 só registo
	 Loading.Show()
	 Me.Close()
 Else
	 MsgBox("Dados incorretos")
 End If
End Sub
Edited by Caça
Link to comment
Share on other sites

Eu agora adicionei as plicas "@.." mas tenho um erro.

cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User=@user AND password=@pass", conn)
cmd.Parameters.AddWithValue("@user", txtuser.Text)
	 cmd.Parameters.AddWithValue("@pass", txtpass.Text)

Diz que tem erro na query perto de "User".

Object reference not set to an instance of an object.

tr = ds.Tables("consulta").Rows.Count <> 1

O que é que se encontra mal ?

Edited by vascoc
Link to comment
Share on other sites

Pelos vistos os campos no sqlCE têm que estar entre [ ]: "SELECT * FROM Utilizadores WHERE [user]=@user AND [password]=@pass"

As plicas foi esquecimento meu - são obrigatórias

O último erro (reference not set) deve-se ao facto de a variável ds estar declarada dentro do try - fora do Try/Catch não é reconhecida.

Antes do try coloca dim ds as dataset

O tr = ds.Tables("consulta").Rows.Count <> 1 não é necessário

Link to comment
Share on other sites

Antes demais, desculpem pelo post gigante.

Fixe, isto já está a dar, agora a questão é, eu apaguei os campos da tabela, tinha "aa", "vasco" e agora quando insiro um novo user em runtime com um desses nomes diz que já existem mas na tabela não tenho nenhum campo...mas se tento fazer login com esses dados, não dá..

Eu gravo os users aqui...


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If UserTextBox.Text = "" And PasswordTextBox.Text = "" Then
MsgBox("Preencha os campos!")
Else
Try
conn = New SqlCeConnection(My.Settings.HOTEL_DBConnectionString)
cmd = New SqlCeCommand("Insert into Utilizadores values ('" & UserTextBox.Text & "','" & PasswordTextBox.Text & "')", conn)
da = New SqlCeDataAdapter(cmd)
ds = New DataSet()
conn.Open()
Dim dr As SqlCeDataReader = cmd.ExecuteReader
With conn
If .State = ConnectionState.Open Then 'ta aberto
.Close() ' fechamos
End If
' .Open() ' abrimos a conexao
End With
MsgBox("Registo inserido com sucesso !")
Login.Show()
Me.Close()
Catch ex As Exception
MsgBox("Cliente já existente", MsgBoxStyle.Critical)
End Try
conn.Close()
End If
End Sub

table options:

http://img228.imageshack.us/img228/2193/asdhsz.png

Users:

http://img27.imageshack.us/img27/6981/fffsv.jpg

New user:

http://img833.imageshack.us/img833/378/dfgdft.jpg

está a contar com o auto Identify, devia de resetar

Edited by vascoc
Link to comment
Share on other sites

Já corrigi esse erro, agora tenho outro..

http://img839.imageshack.us/img839/4317/asdden.png

O erro acontece porque insiro em duas colunas de 3..

cmd = New SqlCeCommand("Insert into Utilizadores values ('" & UserTextBox.Text & "','" & PasswordTextBox.Text & "')", conn)

A minha coluna Num_User tem Identify...adiciona o número automaticamente

http://img27.imageshack.us/img27/6981/fffsv.jpg

Link to comment
Share on other sites

boas eu tambem estou com o mesmo problema, so que e a primeira vez que trabalho com base de dados dentro do vb e no sei muito bem como trabalhar com isso.

a forma que eu estou a usar e aproveitado de um livro e adaptei-o conforme a minha necessidade e deu-me nisto

If UtilizadorIntTableAdapter.GetUserData(Database1DataSet.UtilizadorInt.UtilizadorColumn) = txtUsername.Text And _

UtilizadorIntTableAdapter.GetUserData(Database1DataSet.UtilizadorInt.PasswordColumn) = txtPassword.Text Then

MessageBox.Show("Accesso Autorizado!")

Else

MessageBox.Show("Accesso Negado!")

End If

so que na parte sublinhada da me um erro "Value of type 'System.Data.DataColumn' cannot be converted to 'Integer'" e eu nao quero que ele converta para integer mas que fique em string

agradecia qualquer tipo de ajuda, nem que seja um site que m deia explicaçoes mas simples 😛

Edited by s4muc4
Link to comment
Share on other sites

boas eu tambem estou com o mesmo problema, so que e a primeira vez que trabalho com base de dados dentro do vb e no sei muito bem como trabalhar com isso.

a forma que eu estou a usar e aproveitado de um livro e adaptei-o conforme a minha necessidade e deu-me nisto

If UtilizadorIntTableAdapter.GetUserData(Database1DataSet.UtilizadorInt.UtilizadorColumn) = txtUsername.Text And _

UtilizadorIntTableAdapter.GetUserData(Database1DataSet.UtilizadorInt.PasswordColumn) = txtPassword.Text Then

MessageBox.Show("Accesso Autorizado!")

Else

MessageBox.Show("Accesso Negado!")

End If

so que na parte sublinhada da me um erro "Value of type 'System.Data.DataColumn' cannot be converted to 'Integer'" e eu nao quero que ele converta para integer mas que fique em string

agradecia qualquer tipo de ajuda, nem que seja um site que m deia explicaçoes mas simples 😛

deixem tar, eu abro um forum novo

Edited by s4muc4
Link to comment
Share on other sites

Ora bem este é o meu código de inserção, mas imagina-mos que o user está a inserir um que já exista, como faço para verificar se já existe e mandar mensagem de aviso ?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If UserTextBox.Text = "" And PasswordTextBox.Text = "" And Direitos_userComboBox.SelectedIndex = 0 Then
	    MsgBox("Preencha os campos!")
    Else
	    Try
		    conn = New SqlCeConnection(My.Settings.HOTEL_DBConnectionString)
		    cmd = New SqlCeCommand("INSERT INTO Utilizadores ([Nome], [password], [Direitos_user]) VALUES ('" & UserTextBox.Text & "','" & PasswordTextBox.Text & "','" & Direitos_userComboBox.SelectedItem & "')", conn)
		    da = New SqlCeDataAdapter(cmd)
		    ds = New DataSet()
		    conn.Open()
		    Dim dr As SqlCeDataReader = cmd.ExecuteReader
		    With conn
			    If .State = ConnectionState.Open Then 'ta aberto
				    .Close() ' fechamos
			    End If
			    ' .Open() ' abrimos a conexao
		    End With
		    MsgBox("Registo inserido com sucesso !")
		    Utilizadores.Show()
		    Me.Close()
	    Catch ex As Exception
		    MessageBox.Show(ex.ToString)
	    End Try
	    conn.Close()
    End If
   End Sub
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.