Jump to content

Recommended Posts

Posted

Para uma melhor compreensão da aplicação, vou postar aqui todo o meu codigo da aplicação .

O que eu pretendo é numa webapplication em C# , fazer o login e quando o login é efectuado , ele guarda a data / hora ,e o ip em dois campos (lastlogin e lastip) numa tabela (utilizadores) .

O codigo para conseguir o IP e a Data/hora está correcto porque ele está a apresenta-los numa label, apenas quando o login é feito com as credenciais correctas .

Apenas não guarda e não sei porque :x

public partial class _Default : System.Web.UI.Page
    {

        int a;


        protected void Button1_Click(object sender, EventArgs e)
        {

            string connectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\escola.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            SqlConnection sqlconn = new SqlConnection(connectionString);
            sqlconn.Open();
            SqlCommand comm = new SqlCommand("Select count(*) From utilizadores Where username = @utilizador And password = @password", sqlconn);

            comm.Parameters.Add("@utilizador", SqlDbType.NVarChar).Value = TextBox1.Text;
            comm.Parameters.Add("@password", SqlDbType.NVarChar).Value = TextBox2.Text;


            int i = (int)comm.ExecuteScalar();

            // Se i for maior que zero é porque achou o usuario/senha, senao não acho
            if (i > 0)
            {
                Lbl.Text = ("Senha correcta");
                string result = String.Empty;

                result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                if (string.IsNullOrEmpty(result))
                {
                    result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
                }

                if (string.IsNullOrEmpty(result))
                {
                    result = HttpContext.Current.Request.UserHostAddress;
                }


                lblip.Text = (result);


                DateTime x = DateTime.Now;

                lbldate.Text = (Convert.ToString(x));
                a = 0;

            }

            else
                Lbl.Text = ("Senha ou utilizador errado");
            a = 1;


            sqlconn.Close();

            if (a == 0)
            {
                
                //guarda, pois o user é correcto

                try
                {

                    string connectionString2 = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\escola.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

                    SqlConnection conn = new SqlConnection(connectionString2);
                    SqlCommand cmd = new SqlCommand("UPDATE lastlogin,lastip FROM utilizadores WHERE username=@utilizador", conn);
                    cmd.Parameters.AddWithValue("@utilizador", TextBox1.Text);
                    cmd.Parameters.AddWithValue("@lastlogin", lbldate.Text);
                    cmd.Parameters.AddWithValue("@lastip", lblip.Text);

                    conn.Open();

                    cmd.ExecuteNonQuery();

                    conn.Close();
                }
                finally { }
            }






        }

Só uma coisa, no comando sql que eu uso, estou a usar o UPDATE , porque o que eu quero guardar é sempre a ultima data em que o utilizador esteve "logado" . Mas a primeira vez, o valor vai estar null, ou seja , não vai estar nada na tabela . É possivel fazer UPDATE a um valor null ? :s

Posted

Yep. É perfeitamente possivel fazer um update a um valor null.

O teu problema é que não estas a fazer update a nada. Não estás a indicar que valores fazer update, só os campos.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Posted

Yep. É perfeitamente possivel fazer um update a um valor null.

O teu problema é que não estas a fazer update a nada. Não estás a indicar que valores fazer update, só os campos.

Ja mudei o codigo

Meti o seguinte no UPDATE :

SqlCommand cmd = new SqlCommand("UPDATE utilizadores set lastlogin=lbldate.Text, lastip=lblip.Text where username=TextBox1.Text", conn);

Mas continua a não guardar nada :x

Posted

Mas continua a não guardar nada :x

Porque será....

Aconselho-te a ires copiar o update à mesma fonte de onde copias-te a primeira query. Ou então perguntares à pessoa que fez a 1ª query porque é que essa funciona e a do update não.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Posted

O endereço IP ? não terás problemas com redes internas? ou seja, IP's iguais, basta existirem 2 redes internas diferentes mas na mesma gama

Não porque estou a executar no localhost ainda .

Porque será....

Aconselho-te a ires copiar o update à mesma fonte de onde copias-te a primeira query. Ou então perguntares à pessoa que fez a 1ª query porque é que essa funciona e a do update não.

A fonte onde vi onde se fazia o login, só tinha o SELECT .

Já pesquisei tudo por Update e nada :s

Decidi fazer uma experiencia , coloqei o codigo da ligação no webform_load e quando vou à base de dados, os valores já não estão a Null, mas sim um espaço em branco .

Isto acontece porque no inicio, o lblip e a lbldate estão com o atributo .text em branco .

daí, deduzi que o erro estivesse aqui :

                    SqlCommand cmd1 = new SqlCommand("UPDATE utilizadores set lastlogin=@lastlogin, lastip=@lastip where username=@utilizador", conn1);

                    cmd1.Parameters.Add("@utilizador", SqlDbType.NVarChar).Value = TextBox1.Text;
                    cmd1.Parameters.Add("@lastlogin", SqlDbType.NVarChar).Value = lbldate.Text;
                    cmd1.Parameters.Add("@lastip", SqlDbType.NVarChar).Value = lblip.Text;

Alguém me pode orientar ?

Posted

Olha para as tuas 2 querys de update e vê se descobres as diferenças

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Posted

Não na query sql mesmo.

SqlCommand cmd = new SqlCommand("UPDATE utilizadores set lastlogin=lbldate.Text, lastip=lblip.Text where username=TextBox1.Text", conn);

VS

SqlCommand cmd1 = new SqlCommand("UPDATE utilizadores set lastlogin=@lastlogin, lastip=@lastip where username=@utilizador", conn1);
[/quote]
Se dizes que a debaixo funciona (faz o update) e a de cima não, então é ver as diferenças.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Posted

Não na query sql mesmo.

VSSe dizes que a debaixo funciona (faz o update) e a de cima não, então é ver as diferenças.[/code]

Já tenho esse codigo e continua a não dar.

Penso que ele nao esta a assumir isto :

                    cmd1.Parameters.Add("@utilizador", SqlDbType.NVarChar).Value = TextBox1.Text;
                    cmd1.Parameters.Add("@lastlogin", SqlDbType.NVarChar).Value = lbldate.Text;
                    cmd1.Parameters.Add("@lastip", SqlDbType.NVarChar).Value = lblip.Text;
Posted

Quando é que estás a fazer isso? Não é quando carregas no botão?

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Posted

Quando é que estás a fazer isso? Não é quando carregas no botão?

Sim, o codigo de botão é este :

protected void Button1_Click(object sender, EventArgs e)
        {

        string connectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\escola.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            SqlConnection sqlconn = new SqlConnection(connectionString);
            sqlconn.Open();
            SqlCommand comm = new SqlCommand("Select count(*) From utilizadores Where username = @utilizador And password = @password", sqlconn);

            comm.Parameters.Add("@utilizador", SqlDbType.NVarChar).Value = TextBox1.Text;
            comm.Parameters.Add("@password", SqlDbType.NVarChar).Value = TextBox2.Text;
          int i = (int)comm.ExecuteScalar();

            // Se i for maior que zero é porque achou o usuario/senha
            if (i > 0)
            {
                Lbl.Text = ("Senha correcta");
                            a = 0;
            }
       else
                Lbl.Text = ("Senha ou utilizador errado");
            a = 1;
            sqlconn.Close();


            if (a == 0)
            {

                //guarda, pois o user é correcto

                try
                {

                    string connectionString2 = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\escola.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

                    SqlConnection conn1 = new SqlConnection(connectionString2);
                    conn1.Open();
                    SqlCommand cmd1 = new SqlCommand("UPDATE utilizadores set lastlogin=@lastlogin, lastip=@lastip where username=@utilizador", conn1);

                    cmd1.Parameters.Add("@utilizador", SqlDbType.NVarChar).Value = TextBox1.Text;
                    cmd1.Parameters.Add("@lastlogin", SqlDbType.NVarChar).Value = lbldate.Text;
                    cmd1.Parameters.Add("@lastip", SqlDbType.NVarChar).Value = lblip.Text;
                    cmd1.ExecuteNonQuery();
                    conn1.Close();

                }
                finally { }
            }
        }
Posted

http://www.portugal-a-programar.pt/index.php?showtopic=27234

http://www.portugal-a-programar.pt/index.php?showtopic=27224

Mas o que é que se passa?

Andam a copiar o código uns aos outros?

Já agora nunca vai guardar porque o 'a' vai ser sempre igual a 1

lol sempre bom...  👍

// Se i for maior que zero é porque achou o usuario/senha

            if (i > 0)

            {

                Lbl.Text = ("Senha correcta");

                            a = 0;

            }

      else

          {

                Lbl.Text = ("Senha ou utilizador errado");

            a = 1;

            }

            sqlconn.Close();

Como indicou o Betovsky sem os parentesis 'a' vai ser sempre 1.

Haxta

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.