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

gadNY

SELECT a uma BD

31 mensagens neste tópico

SqlConnection sqlconn = new SqlConnection(connectionString);
            //Abrir a ligacao:
            sqlconn.Open();
            //executar comandos:
            SqlCommand cmd = new SqlCommand("SELECT nometurma,anoturma,nomearea FROM turmas, areas WHERE nometurma = @letraturma", sqlconn);
            cmd.Parameters.Add("@letraturma", SqlDbType.NVarChar).Value = comboturma.SelectedItem;
            //datareader:

            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                List.Items.Add(dr["nometurma"] + " - " + dr["anoturma"] + " - " + dr["nomearea"]);
            }

eu tenho isto para apresentar numa list os campos que tenho em duas tabelas .

o problema e que ao inserir na combobox o nome da turma(letraturma) ele vai listar na List o ano da turma, a letra para cada area :X´

ou seja aparece o seguinte na list:

A-3-Inf

A-3-Elect

o problema e que eu so tenho A-3-Inf :X

alguem sabe porque esta a mostrar um ano e uma letra para cada area ? :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na consulta SQL falta-te relacionar a chave primária com a externa, ou seja relacionar as duas tabelas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, não sei se percebi muito bem o teu problema, mas vamos lá então.

Para já vamos esclarecer alguns pontos:

Inf - É o que tu chamas área, certo?

3 - É o ano da turma?

A - É a turma?

Partindo do principio que assim é, na tua ComboBox queres algo do género ?

Turma 3A Inf

Turma 3B Elec

Turma 1C Inf

etc...

Partindo do principio que é isso que queres, presumo que tenhas na tua tabela turmas uma chave estrangeira da tabela areas, de modo a que saibas a que área a turma pertence.

Portanto na tua consulta tens de ligar as duas tabelas através dessa chave estrangeira.

Ficaria assim: SELECT nometurma,anoturma,nomearea FROM turmas, areas WHERE nometurma = @letraturma AND turmas.fk_area=areas.pk_area

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim, eu tenho tres combos, uma para escolher a area, outra a turma e outra o ano.

ao fazer a pesquisa por uma combo(ex:turma) queria que mostra-se todas as turmas com essa letra e respectivos anos e areas.

mas se eu tiver so uma turma "A" do 3 ano e da area de informatica ele nao vai mostrar apenas isso, associa uma turma a cada area existente , ou seja vai apresentar:

A 3 informatica

A 3 electronica

mas a A 3 electronica nao existe, ele associa uma turma a todas as areas que existem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hmm ok, já percebi

Se puderes mostrar um diagrama da tua BD ou a estrutura das 2 tabelas (turmas e areas) seria mais fácil ajudar-te.

Mas bom, uma forma é criares uma consulta para cada "filtro" (ano, turma, área) que associavas ao evento SelectedIndexChanged das ComboBox.

Em que as consultas ficariam desta forma:

- Para o ano:

SELECT nometurma,anoturma,nomearea FROM turmas, areas WHERE anoturma= @anoturma AND turmas.fk_area = areas.pk_area

- Para a turma:

SELECT nometurma,anoturma,nomearea FROM turmas, areas WHERE nometurma= @nometurma AND turmas.fk_area = areas.pk_area

- Para a area:

SELECT nometurma,anoturma,nomearea FROM turmas, areas WHERE turmas.fk_area = @fk_area AND turmas.fk_area = areas.pk_area

Ao juntares "turmas.fk_area = areas.pk_area" isto à consulta estás a ligar as 2 tabelas, a tabela turmas e a tabela areas. Como não o estás a fazer a tua consulta devolve-te tudo o que tens nas 2 tabelas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois, mas eu so quero que na listbox apareca:

nomedoaluno - letradaturma-anodaturma-areadaturma.

e ele esta a apresentar tudo, o problema e que apresenta  1 nomedealuno,letradaturma, anodaturma para cada areadaturma existente na BD :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sem ver a estrutura da tua BD é difícil ajudar-te a construir a consulta que te devolva o que queres.

Mas pelo que vejo é realmente um problema de falta de uso de chaves estrangeiras para relacionares as tabelas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

na query SQL tens que fazer o JOIN das tabelas, e indicar qual a chave de ligação, chave estrangeira,

SELECT nometurma,anoturma,nomearea FROM turmas as t JOIN areas as a ON a.id_area = t.id_area WHERE nometurma = @letraturma

se não indicares que é um JOIN e indicares a Chave estrangeira o SQL cria as n*m possibilidades entre as tabelas. em vez de 1 para 1 como é o caso.

Espero ter ajudado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e' mesmo isso, ja esta tudo certo : D

so uma ultima pergunta, com os INSERT's DELETE's e UPDATE's vai se passar o mesmo ?

e se tiver dois campos id de duas outras tabelas ? :/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SqlConnection conn = new SqlConnection(connectionString);
                    SqlCommand cmd = new SqlCommand("INSERT INTO utilizadores VALUES (@nome,@username,@password)", conn);
                    conn.Open();
                    cmd.Parameters.AddWithValue("@nome", txt_nome.Text);
                    cmd.Parameters.AddWithValue("@username", txt_user.Text);
                    cmd.Parameters.AddWithValue("@password",txt_pass.Text);
                    cmd.ExecuteNonQuery();

eu tenho isto dentro de um try, que esta dentro de um if, se guardar os ficheiros ele vai mostrar uma messagebox, o problema e que ele faz tudo, mostra a messagebox mas nao e esta a inserir na base de dados, eu acho que o problema esta no insert, mas nao consigo encontrar o erro :X

tambem ja fiz o insert assim:

("INSERT INTO utilizadores(nome,username,password) VALUES (@nome,@username,@password)

a tabela utilizadores tem mais campos, mas todos os outros permitem NULL.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens o insert dentro de uma transacção? Se sim, não te esqueceste de fazer commit?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A chave primária está a incrementar automaticamente?  :confused:

no Try Catch, cria uma label ou usa uma label que tenhas, so pra ver qual o erro do SQL.

Try{//o teu codigo
}
Catch (Exception e)
{ Label1.Text = e.ToString(); }
Finnally{
conn.Close();
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pessoal, continuo com a mesma duvida :X

ao fazer um select a uma tabela que tem campos de ligacao ele mostra os registo para cada campo da outra ex:

tabela turmas(A, :)

tabela areas(inf, elec)

ou seja, eu tenho uma turma A de elec por exemplo, mas ao fazer o select aparece A- elec e A- inf :x

esta a ligar a turma a cada campo da outra tabela :x

SELECT nometurma,anoturma,nomearea FROM turmas, areas WHERE anoturma= @anoturma AND turmas.fk_area = areas.pk_area

ja tentei isto e nao resolveu :x

alguem sabe como ligar as duas tabelas e associar direito ? :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto não tem nada a ver com C# mas sim com bases de dados.

Mostra lá o modelo de dados, incluindo as chaves estrangeiras.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A query

SELECT nometurma,anoturma,nomearea

FROM turmas, areas WHERE anoturma= @anoturma

AND turmas.fk_area = areas.pk_area

devolve-te todas as relações entre turmas e áreas do ano indicado (@anoturma).

Logo é normal que A- elec e A- inf apareçam dado que essas relações existem.

Se necessitas de algo mais especifico vais ter de restringir mais a query, aplicando mais critérios no filtro.

acontece que nos teus dados existe uma

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois, mas nao exite um A elec, apenas existe um A inf .

como posso restringir ? :x

SELECT nometurma,anoturma,nomearea FROM turmas as t JOIN areas as a ON a.id_area = t.id_area WHERE nometurma = @letraturma

usei isto e nao esta a funcionar na mesma :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é equivalente ao que já tinhas.

Mostra lá os dados que tens em cada uma das tabelas, a informação completa, e o valor que estás a passar para @letraturma

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

2ngd183.jpg

os dados da tabela turma .

o que estou a passar e isto

SqlConnection conn = new SqlConnection(connectionString);
                        conn.Open();
                        SqlCommand cmd = new SqlCommand("SELECT nometurma,anoturma,nomearea FROM turmas, areas", conn);
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.Add("letraturma", SqlDbType.NVarChar).Value = comboinserir.Text + "%";
                        SqlDataReader dr1 = cmd.ExecuteReader();
                        int nColunas = dr1.FieldCount;
                        for (int i = 0; i < nColunas; i++)
                        {
                            datagridpesq.Columns.Add(dr1.GetName(i).ToString(), dr1.GetName(i).ToString());
                        }
                        string[] linhaDados = new string[nColunas];
                        while (dr1.Read())
                        {
                            for (int a = 0; a < nColunas; a++)
                            {
                                if (dr1.GetFieldType(a).ToString() == "System.Int32")
                                {
                                    linhaDados[a] = dr1.GetInt32(a).ToString();
                                }
                                if (dr1.GetFieldType(a).ToString() == "System.String")
                                {
                                    linhaDados[a] = dr1.GetString(a).ToString();
                                }
                                if (dr1.GetFieldType(a).ToString() == "System.DateTime")
                                {
                                    linhaDados[a] = dr1.GetDateTime(a).ToString();
                                }
                        }
                            datagridpesq.Rows.Add(linhaDados);
                            DataSet ds = new DataSet();
                            SqlDataAdapter da = new SqlDataAdapter();

eu tenho uma combobox com os anos do 1 ao 12 se pesquisar por ano, se pesquisar por letra(nometurma) a combo passa a ter as letras do A ao Z, ao escolher um vai fazer a pesquisa por essa letra ou numero

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, por esses dados, as únicas combinações que te vãio retornar apenas um resultado são:

NomeTurma = A

NomeTurma = B

NomeTurma = C

AnoTurma = 1

AnoTurma = 2

Qualquer outro valor nesses critérios e vais obter mais de uma resultado.

Mostra o comando de SQL que vais executar, ou seja depois de instanciado com o valor de pesquisa (não quero o comando em C# com variável mas sim o comando SQL para executar no SQL Server).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SqlCommand cmd = new SqlCommand("SELECT nometurma,anoturma,nomearea FROM turmas, areas", conn);

isto ?

e o unico comando que tenho para apresentar os dados na datagrid

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, isso vai dar-te como resultado todas as combinações possíveis entre todos os valores de todas as tabelas.

O que quero é o comando SQL que vais mandar executar, já com a clausula where definida e tudo.

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