• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Mr.kraft

Apanhar valores do SQL para ASP.net em C#

4 mensagens neste tópico

Boas!

O seguinte código, contido num stored procedure,  mostra uma selecção de valores de tabelas relacionadas com alunos e professores.

    IF 
    (	SELECT count(atc_nome) as numero_repeticoes
	FROM autenticacao
	WHERE atc_nome=@atc_nome
	AND atc_password=@atc_password
) = 1
BEGIN
	IF
	(	SELECT atc_tipoConta as tipo_conta 
		FROM autenticacao 
		WHERE atc_nome=@atc_nome 
		AND atc_password=@atc_password
	) = 1
	BEGIN
		SELECT aluno.*, autenticacao.atc_codigo
		FROM aluno, autenticacao
		WHERE aluno.aln_processo = autenticacao.atc_codigo
	END
	ELSE IF
	(	SELECT atc_tipoConta as tipo_conta
		FROM autenticacao
		WHERE atc_nome=@atc_nome
		AND atc_password=@atc_password 
	) = 2
	BEGIN
		SELECT professor.*, autenticacao.atc_codigo
		FROM professor, autenticacao
		WHERE professor.pfs_num = autenticacao.atc_codigo
	END
	ELSE IF
	(	SELECT atc_tipoConta as tipo_conta
		FROM autenticacao
		WHERE atc_nome=@atc_nome
		AND atc_password=@atc_password
	) = 3
	BEGIN
		SELECT *
		FROM autenticacao
		WHERE atc_nome=@atc_nome
		AND atc_password=@atc_password
	END
END

A questão é que quando vou apanhar estes valores no C# ele não entra no While:

SqlCommand command = new SqlCommand("log_in", m_connection) { CommandType = CommandType.StoredProcedure };
            //SqlCommand command = new SqlCommand("SELECT * FROM autenticacao", m_connection);

            command.Parameters.AddWithValue("@atc_nome", txtUsername.Text);
            command.Parameters.AddWithValue("@atc_password", txtPassword.Text);

            m_connection.Open();
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                if (Convert.ToInt16(reader["numero_repeticoes"]) == 1)
                {
                    switch (Convert.ToInt16(reader["tipo_conta"]))
                    {
                        case 1:

                            break;
                    }
                }
                else
                {
                    reader.Close();
                    m_connection.Close();
                    lblErro.Text = "Falha de autenticação";
                    return;
                }
            }
            m_connection.Close();

Isto deve-se ao facto de o procedimento ter IF's ou vários SELECT's?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Diria que o mais provável é ele não entrar no 1º if. Logo não executa nenhum select, logo não te devolve nenhuns dados, logo não entra no while.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção q se retornares o resultado de 2 selects distintos, a query retorna 2 tabelas.

Para ler mais do q uma tabela no lado do c# tens q fazer o reader.NextResult() para avançar de tabela em tabela.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim mas repara que eu leio o valor do tipo de conta num case.

Consoante esse case, buscava os valores do respectivo select.

Eu não entendo muito de sintaxe SQL nem T-SQL e por acaso estou um pouco confuso lol.

De qualquer das maneiras no while já entra mas ele não consegue ler o valor 'numero_repeticoes' e 'tipo_conta'

- if (Convert.ToInt16(reader["numero_repeticoes"]) == 1)

- switch (Convert.ToInt16(reader["tipo_conta"]))

Estas linhas de código dão "IndexOutOfRangeException". Supostamente eu conseguiria obter esse valor, não entendo o erro  :thumbsup:

0

Partilhar esta mensagem


Link 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