vascoc Posted June 21, 2012 at 12:56 PM Report Share #464568 Posted June 21, 2012 at 12:56 PM (edited) 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 June 25, 2012 at 09:18 AM by Caça GeSHi Link to comment Share on other sites More sharing options...
jlpcalado Posted June 21, 2012 at 01:41 PM Report Share #464573 Posted June 21, 2012 at 01:41 PM 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 More sharing options...
vascoc Posted June 21, 2012 at 02:28 PM Author Report Share #464591 Posted June 21, 2012 at 02:28 PM (edited) 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 June 25, 2012 at 09:19 AM by Caça GeSHi Link to comment Share on other sites More sharing options...
vascoc Posted June 22, 2012 at 08:29 AM Author Report Share #464846 Posted June 22, 2012 at 08:29 AM Está a dar erro, diz que tenho erro na query Link to comment Share on other sites More sharing options...
jlpcalado Posted June 22, 2012 at 10:29 AM Report Share #464898 Posted June 22, 2012 at 10:29 AM 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 More sharing options...
vascoc Posted June 22, 2012 at 11:22 AM Author Report Share #464918 Posted June 22, 2012 at 11:22 AM 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 More sharing options...
jlpcalado Posted June 22, 2012 at 03:36 PM Report Share #464975 Posted June 22, 2012 at 03:36 PM 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 More sharing options...
vascoc Posted June 22, 2012 at 09:09 PM Author Report Share #465036 Posted June 22, 2012 at 09:09 PM cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User=@user AND password=@pass, conn) Certo, mas o que é @user ? Eu tenho uma textbox para cada campo, desculpa a demora.. cmd = New SqlCeCommand("SELECT * FROM Utilizadores WHERE User=@user AND password=@pass", conn) Link to comment Share on other sites More sharing options...
jlpcalado Posted June 22, 2012 at 09:57 PM Report Share #465045 Posted June 22, 2012 at 09:57 PM 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 More sharing options...
vascoc Posted June 22, 2012 at 10:03 PM Author Report Share #465048 Posted June 22, 2012 at 10:03 PM (edited) 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 June 25, 2012 at 09:19 AM by Caça Link to comment Share on other sites More sharing options...
vascoc Posted June 25, 2012 at 09:07 AM Author Report Share #465309 Posted June 25, 2012 at 09:07 AM (edited) Está a dizer: " Expression expected. " devido aos @'s 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) Edited June 25, 2012 at 09:07 AM by vascoc Link to comment Share on other sites More sharing options...
vascoc Posted June 25, 2012 at 09:42 AM Author Report Share #465320 Posted June 25, 2012 at 09:42 AM (edited) 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 June 25, 2012 at 01:54 PM by vascoc Link to comment Share on other sites More sharing options...
jlpcalado Posted June 25, 2012 at 05:24 PM Report Share #465426 Posted June 25, 2012 at 05:24 PM 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 More sharing options...
vascoc Posted June 25, 2012 at 05:52 PM Author Report Share #465433 Posted June 25, 2012 at 05:52 PM (edited) 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 IfEnd 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 June 25, 2012 at 08:18 PM by vascoc Link to comment Share on other sites More sharing options...
vascoc Posted June 26, 2012 at 08:48 AM Author Report Share #465562 Posted June 26, 2012 at 08:48 AM 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 More sharing options...
s4muc4 Posted June 26, 2012 at 10:09 AM Report Share #465571 Posted June 26, 2012 at 10:09 AM (edited) 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 June 26, 2012 at 10:17 AM by s4muc4 Link to comment Share on other sites More sharing options...
jlpcalado Posted June 26, 2012 at 12:08 PM Report Share #465584 Posted June 26, 2012 at 12:08 PM cmd = New SqlCeCommand("Insert into Utilizadores ([user], [password]) values ('" & UserTextBox.Text & "','" & PasswordTextBox.Text & "')", conn) Chamo de novo a atenção para o uso de parametros em vez de texto direto ... Link to comment Share on other sites More sharing options...
vascoc Posted June 26, 2012 at 01:31 PM Author Report Share #465599 Posted June 26, 2012 at 01:31 PM (edited) Já consegui resolver este problema. Obrigado jpcalado, vou fazer um novo tópico em relação a isso da inserção. Edited June 27, 2012 at 01:28 AM by vascoc Link to comment Share on other sites More sharing options...
s4muc4 Posted June 26, 2012 at 01:54 PM Report Share #465609 Posted June 26, 2012 at 01:54 PM (edited) 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 June 26, 2012 at 03:44 PM by s4muc4 Link to comment Share on other sites More sharing options...
vascoc Posted June 27, 2012 at 01:29 AM Author Report Share #465812 Posted June 27, 2012 at 01:29 AM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now