Jump to content

Recommended Posts

Posted

Boas pessoal.

Estou a desenvolver um projecto em c# e tenho de aprender tudo de raiz. Tenho de ligar a minha aplicação a uma base de dados.

O meu problema é o seguinte:

A minha aplicação tem um sistema de Login para só utilizadores com permissão poderem aceder a todas as funcionalidades da mesma, e guardo todos esses dados numa base de dados feita no SQLServer.

Tenho o seguinte código implementado mas gera uma excepção a meio (no seguinte passo: SqlDataReader sdr = cmd1.ExecuteReader(); )será que alguém me poderia dar umas luzes do que se está a passar??

private void button1_Click(object sender, EventArgs e)
        {
            String nome = null,pass = null,carg = null;
            String c = comboBox1.Text;
            String n = textBox1.Text;
            String p = textBox2.Text;

            String connectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Documentos_Escolares\\2008-2009\\2_Semestre\\3_Ano\\Projecto\\DistriVig_2\\DistriVig_2\\DistriVig_2.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            SqlConnection sqlConn1 = new SqlConnection(connectionString);
            SqlConnection sqlConn2 = new SqlConnection(connectionString);
            //Abrir conecção a base de dados
            sqlConn1.Open();
            sqlConn2.Open();
            //operaçoes para trabalhar com a base de dados
            try
            {
                SqlCommand cmd1 = new SqlCommand("SELECT nome,cargo FROM Professor WHERE nome = n", sqlConn1);
                SqlDataReader sdr = cmd1.ExecuteReader();


                while (sdr.Read())
                {
                    nome = (String)sdr["nome"];
                    carg = (String)sdr["cargo"];
                }


                SqlCommand cmd2 = new SqlCommand("select pass from Login_Prof where cod_prof = (select cod_prof from Professor where nome = n)", sqlConn2);
                SqlDataReader sdr2 = cmd1.ExecuteReader();

                while (sdr2.Read())
                    pass = (String)sdr2[0];                

            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.ToString());
            }
            finally
            {
                sqlConn1.Close();
                sqlConn2.Close();
            }

            
            //Fechar conecção com a Base de Dados
            if (c.Equals("Categoria do Professor"))
            {
                MessageBox.Show("Escolha a sua categoria!");
            }
            else
                if (n.Equals(""))
                {
                    MessageBox.Show("Nome nao introduzido!");
                }
                else
                    if (p.Equals(""))
                    {
                        MessageBox.Show("Password nao introduzida!");
                    }
                    else
                        if (c.Equals(carg))
                        {
                            if (n.Equals(nome))
                            {
                                if (p.Equals(pass))
                                {
                                    MessageBox.Show("Login efectuado com sucesso!");
                                }
                                else
                                    MessageBox.Show("Utilizador Errado!\nVerifique se introduziu uma password válida");
                            }
                            else
                                MessageBox.Show("Utilizador Errado!\nVerifique se introduziu um nome válido");
                        }
                        else
                            MessageBox.Show("Utilizador Errado!\nVerifique a Categoria");
            this.Dispose();
            
        }
Posted

Isso é porque a tua query sql está errada. Logo quando mandas executá-la dá erro (ExecuteReader).

O problema está no 'n', ao dizeres "where nome = n", esse 'n' não é a tua variável. É literalmente n, e como na base de dados não existe nada com esse nome dá erro.

Aconselho-te a leres o seguinte link que ensina tudo o que precisas de saber para interagir com uma base de dados em C#.

"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

  • 2 weeks later...
Posted

Alteraste como? Mostra o código só para confirmar se ficou ok. Se isso estiver bem e continuar a não dar, é porque não tens o valor correspondente na BD.

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

Posted

Tenho este código por enquanto.

private void button1_Click(object sender, EventArgs e)
        {
            String nome = null,pass = null,carg = null;
            String c = comboBox1.Text;
            String n = textBox1.Text;
            String p = textBox2.Text;

            String connectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Documentos_Escolares\\2008-2009\\2_Semestre\\3_Ano\\Projecto\\DistriVig_2\\DistriVig_2\\DistriVig_2.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            SqlConnection sqlConn1 = new SqlConnection(connectionString);
            SqlConnection sqlConn2 = new SqlConnection(connectionString);
            //Abrir conecção a base de dados
            sqlConn1.Open();
            sqlConn2.Open();
            //operaçoes para trabalhar com a base de dados
            // para colocar uma variavel no comando sql -> 'n'  ou -> '@n' ver qual funca
            SqlCommand cmd1 = new SqlCommand("SELECT nome,cargo FROM Professor WHERE nome = '@n'", sqlConn1);
            SqlDataReader sdr = cmd1.ExecuteReader();
            while (sdr.Read())
            {
                nome = (String)sdr[0];
                carg = (String)sdr[1];
            }
            sdr.Close();
            SqlCommand cmd2 = new SqlCommand("SELECT pass FROM Login_Prof WHERE cod_prof = (SELECT cod_prof FROM Professor WHERE nome = '@n')", sqlConn2);
            SqlDataReader sdr2 = cmd2.ExecuteReader();
            while (sdr2.Read())
            {
                pass = (String)sdr2[0];
            }
            sdr2.Close();
            
            MessageBox.Show(c + "\n" + n + "\n" + p + "\nSegunda Versão\n" + nome + "\n" + pass + "\n" + carg + "\n");
            //Fechar conecção com a Base de Dados
            if (c.Equals("Categoria do Professor"))
            {
                MessageBox.Show("Escolha o seu Cargo!");
            }
            else
                if (n.Equals(""))
                {
                    MessageBox.Show("Nome nao introduzido!");
                }
                else
                    if (p.Equals(""))
                    {
                        MessageBox.Show("Password nao introduzida!");
                    }
                    else
                        if (c.Equals(carg))
                        {
                            if (n.Equals(nome))
                            {
                                if (p.Equals(pass))
                                {
                                    MessageBox.Show("Login efectuado com sucesso!");
                                    sdr.Close();
                                    sdr2.Close();
                                    sqlConn1.Close();
                                    sqlConn2.Close();
                                    this.Dispose();
                                }
                                else
                                    MessageBox.Show("Utilizador Errado!\nVerifique se introduziu uma password válida");
                            }
                            else
                                MessageBox.Show("Utilizador Errado!\nVerifique se introduziu um nome válido");
                        }
                        else
                            MessageBox.Show("Utilizador Errado!\nVerifique se introduziu o cargo correcto");     
        }

Nao funciona na parte

while(sdr.read){

    nome = (String)sdr[0];

    carg = (String)sdr[1];

}

Já experimentei imprimir uma string dentro do ciclo e não a imprime!!

Não consigo perceber porque isto nao funciona, ate porque já pesquisei bastante e não consigo perceber o porque? Em relação a não ter os valores na base de dados, acho isso impossível até porque já experimentei a query no SQLServer e deu tudo certinho.

Posted

Oky já puseste na query para usar o parâmetro @n. Mas não estás a definir qual o valor do parâmetro. Tens de adicionar o parâmetro ao comando.

"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

É assim. Na query indicaste que vais usar uma variável 'n'. O nome disso é parâmetro. Mas não estás a indicar qual o valor dessa variável, logo não vai ter valor nenhum, o que faz com que quando executas o SqlCommand não te devolva nada.

A forma de indicares ao SqlCommand o valor do 'n' é criares um SqlParameter. Em que especificas que o SqlParameter é para a "variável" @n, dizer que é do tipo nVarChar (presumo eu, será o tipo da coluna nome na base de dados) e irá ter o valor de "XPTO".

Podes ver melhor explicado aqui.

"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

Betovsky, já consegui resolver a minha situação.

Obrigado pela grande ajuda.

Thanks.  😄 :D 🙂👍

Se prescisar de mais alguma coisa eu volto

🙂 :) 🙂 :) 🙂 :) 🙂 :) 🙂 :) 🙂 :) 🙂 :) 🙂 :) 🙂 :) 🙂 :)

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.