Usuário com melhor resposta
Porque o Dataset com TableAdapter esta quadruplicando as informações?

Pergunta
-
Boa tarde amigos,
Possuo um Dataset com um TableAdapter em que o mesmo esta quadruplicando a quantidade de todas as informações, alguém sabe me dizer o porque esta acontecendo isso?
Veja na imagem abaixo que na tabela do banco de dados só possui duas informações no TituloPesquisa, ou seja duas pesquisas, alguém sabe me dizer porque o Dataset com TableAdapter esta se comportando desta forma?
Respostas
-
As informações estão se repetindo, por causa dos seus Inner Joins. Provavelmente as suas tabelas OpcoesRespostas, Perguntas e Resultadoes são tabelas que possuem vários registros para cada registro da tabela Pesquisa, ou seja 1- N ou N- N
O que você está querendo listar com esse SELECT?- Marcado como Resposta Marcos SJ segunda-feira, 2 de novembro de 2015 11:09
-
Não entendi bem como você quer mostrar esses dados para o seu usuário.
Da forma que você fez esse SELECT com o UNION, não faz sentido pra mim, já que são tabelas e dados distintos.
Quando me referi a você fazer SELECT's separados, era realmente separados, o UNION não irá lhe ajudar nesse caso.
Vamos supor que você queira mostrar uma listagem na tela com suas pesquisas, perguntas, opções de resposta e a resposta. Fiz um exemplo aqui para você entender a estrutura:
<asp:SqlDataSource ID="PesquisaSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SuaConn %>" SelectCommand="SELECT PesquisaId, TituloPesquisa, Populacao, Amostra, Municipio FROM Pesquisas" /> <asp:Repeater ID="PesquisaRepeater" DataSourceID="PesquisaSqlDataSource" runat="server"> <ItemTemplate> <asp:HiddenField ID="PesquisaIdHiddenField" runat="server" Value='<%# Eval("PesquisaId") %>' /> <span>Título:</span><span><%# Eval("TituloPesquisa") %></span> <span>População:</span><span><%# Eval("Populacao") %></span> <span>Amostra:</span><span><%# Eval("Amostra") %></span> <span>Município:</span><span><%# Eval("Municipio") %></span> <asp:SqlDataSource ID="PerguntasSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SuaConn %>" SelectCommand="SELECT PerguntaId, DescricaoPergunta FROM Perguntas WHERE PesquisaId = @PesquisaId"> <SelectParameters> <asp:ControlParameter ControlID="PesquisaIdHiddenField" PropertyName="Value" Name="PesquisaId" Type="Int32" /> </SelectParameters> </asp:SqlDataSource> <asp:Repeater ID="PerguntasRepeater" DataSourceID="PerguntasSqlDataSource" runat="server"> <ItemTemplate> <asp:HiddenField ID="PerguntaIdHiddenField" runat="server" Value='<%# Eval("PerguntaId") %>' /> <span>Pergunta:</span><span><%# Eval("DescricaoPergunta") %></span> <asp:SqlDataSource ID="OpcoesRespostasSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SuaConn %>" SelectCommand="SELECT RespostaId, DescricaoOpRes, Resultadoes.OpcaoRespostaId FROM OpcoesRespostas LEFT OUTER JOIN Resultadoes ON OpcoesRespostas.OpcaoRespostaId = Resultadoes.OpcaoRespostaId WHERE PerguntaId = @PerguntaId"> <SelectParameters> <asp:ControlParameter ControlID="PerguntaIdHiddenField" PropertyName="Value" Name="PerguntaId" Type="Int32" /> </SelectParameters> </asp:SqlDataSource> <asp:Repeater ID="OpcoesRespostasRepeater" DataSourceID="OpcoesRespostasSqlDataSource" runat="server"> <ItemTemplate> <span>Opção:</span><span><%# Eval("DescricaoOpRes") %> <%# !string.IsNullOrEmpty(Eval("OpcaoRespostaId").ToString())? "Resposta Correta!" : "" %></span> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater>
Explicando o que eu fiz:
1) Criei um SqlDataSource Selecionando todas as Pesquisas;
2) Um Repeater listando todas as pesquisas;
3) Dentro do Repeater das Pesquisas, eu criei outro SqlDataSource selecionando as perguntas de cada pesquisa. Note que estou usando um SelectParameter para receber o valor de cada Pesquisa, conforme o repeater é listado;
4) Um Repeater listando todas as perguntas
5) Dentro do Repeater das Perguntas, eu criei outro SqlDataSource selecionando as opções de respostas de cada pergunta e fazendo um JOIN com a tabela de Resultadoes para saber qual é a opção de resposta que possui o resultado correto. Note que estou usando um SelectParameter para receber o valor de cada Pergunta, conforme o repeater é listado;
6) Um Repeater listando todas as opções de resposta e identificando qual é a resposta correta.
OBS: Não sei bem quais são seus campos nas tabelas, etc. Fiz o que eu achei que era, mas aí vê e ajusta.
- Editado André Secco [MSP] segunda-feira, 16 de novembro de 2015 20:49 Identação
- Marcado como Resposta Vando Junior sexta-feira, 20 de novembro de 2015 10:21
Todas as Respostas
-
As informações estão se repetindo, por causa dos seus Inner Joins. Provavelmente as suas tabelas OpcoesRespostas, Perguntas e Resultadoes são tabelas que possuem vários registros para cada registro da tabela Pesquisa, ou seja 1- N ou N- N
O que você está querendo listar com esse SELECT?- Marcado como Resposta Marcos SJ segunda-feira, 2 de novembro de 2015 11:09
-
Estou tentado trazer as tabelas Pesquisas, Peguntas, OpçoesRespostas, Resultadoes.
Pesquisas: TituloPesquisa, Populacao, Amostra, Municipio
Perguntas: DescricaoPergunta
OpcoesRespostas: DescricaoOpRes
Resultadoes: OpcaoRespostaId
obs: Neste caso possuímos varias pesquisas em que cada pesquisa possui varias perguntas e cada pergunta possui algumas opções de respostas. Preciso trazer as informações desta forma, mas que não duplique as informações. Será que devo fazer um select para cada tabela ? Obrigado pela imensa ajuda.
-
Sim, como você possui esse tipo de relacionamento entre as tabelas, se você fizer em um SELECT apenas, vai duplicar as informações das tabelas de nível mais "alto".
Eu recomento você fazer um SELECT para as Pesquisas. Aí dentro de cada resultado deste SELECT, você deverá fazer um outro para pegar as Perguntas, passando na cláusula WHERE o Id da respectiva pesquisa (Para que ele não traga todas as perguntas do banco e sim apenas aquelas que são da Pesquisa em questão). Aí para cada pergunta você faz um SELECT das opções de resposta, passando na cláusula WHERE o Id da respectiva pergunta...e assim por diante.
OBS: Tome cuidado com popular muitos dados na tela ou relatório, não esqueça que por ter esse nível hierárquico muitas consultas serão feitas, então, o quanto enxuto for sua consulta, melhor será a performance.
-
Estou realizando desta forma, estou no caminho certo?
SELECT PesquisaId, TituloPesquisa, Populacao, Amostra, Municipio FROM Pesquisas WHERE (PesquisaId = PesquisaId)
UNION
SELECT PerguntaId, DescricaoPergunta, Null, Null, Null FROM Perguntas WHERE (PerguntaId = PerguntaId)
Pode verificar se esta dando certo e se é possível identificar algum erro.
Para cada pesquisa considera-se apenas uma pergunta e não todas. Obrigado pela atenção me ajudando muito. -
Não entendi bem como você quer mostrar esses dados para o seu usuário.
Da forma que você fez esse SELECT com o UNION, não faz sentido pra mim, já que são tabelas e dados distintos.
Quando me referi a você fazer SELECT's separados, era realmente separados, o UNION não irá lhe ajudar nesse caso.
Vamos supor que você queira mostrar uma listagem na tela com suas pesquisas, perguntas, opções de resposta e a resposta. Fiz um exemplo aqui para você entender a estrutura:
<asp:SqlDataSource ID="PesquisaSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SuaConn %>" SelectCommand="SELECT PesquisaId, TituloPesquisa, Populacao, Amostra, Municipio FROM Pesquisas" /> <asp:Repeater ID="PesquisaRepeater" DataSourceID="PesquisaSqlDataSource" runat="server"> <ItemTemplate> <asp:HiddenField ID="PesquisaIdHiddenField" runat="server" Value='<%# Eval("PesquisaId") %>' /> <span>Título:</span><span><%# Eval("TituloPesquisa") %></span> <span>População:</span><span><%# Eval("Populacao") %></span> <span>Amostra:</span><span><%# Eval("Amostra") %></span> <span>Município:</span><span><%# Eval("Municipio") %></span> <asp:SqlDataSource ID="PerguntasSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SuaConn %>" SelectCommand="SELECT PerguntaId, DescricaoPergunta FROM Perguntas WHERE PesquisaId = @PesquisaId"> <SelectParameters> <asp:ControlParameter ControlID="PesquisaIdHiddenField" PropertyName="Value" Name="PesquisaId" Type="Int32" /> </SelectParameters> </asp:SqlDataSource> <asp:Repeater ID="PerguntasRepeater" DataSourceID="PerguntasSqlDataSource" runat="server"> <ItemTemplate> <asp:HiddenField ID="PerguntaIdHiddenField" runat="server" Value='<%# Eval("PerguntaId") %>' /> <span>Pergunta:</span><span><%# Eval("DescricaoPergunta") %></span> <asp:SqlDataSource ID="OpcoesRespostasSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SuaConn %>" SelectCommand="SELECT RespostaId, DescricaoOpRes, Resultadoes.OpcaoRespostaId FROM OpcoesRespostas LEFT OUTER JOIN Resultadoes ON OpcoesRespostas.OpcaoRespostaId = Resultadoes.OpcaoRespostaId WHERE PerguntaId = @PerguntaId"> <SelectParameters> <asp:ControlParameter ControlID="PerguntaIdHiddenField" PropertyName="Value" Name="PerguntaId" Type="Int32" /> </SelectParameters> </asp:SqlDataSource> <asp:Repeater ID="OpcoesRespostasRepeater" DataSourceID="OpcoesRespostasSqlDataSource" runat="server"> <ItemTemplate> <span>Opção:</span><span><%# Eval("DescricaoOpRes") %> <%# !string.IsNullOrEmpty(Eval("OpcaoRespostaId").ToString())? "Resposta Correta!" : "" %></span> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater>
Explicando o que eu fiz:
1) Criei um SqlDataSource Selecionando todas as Pesquisas;
2) Um Repeater listando todas as pesquisas;
3) Dentro do Repeater das Pesquisas, eu criei outro SqlDataSource selecionando as perguntas de cada pesquisa. Note que estou usando um SelectParameter para receber o valor de cada Pesquisa, conforme o repeater é listado;
4) Um Repeater listando todas as perguntas
5) Dentro do Repeater das Perguntas, eu criei outro SqlDataSource selecionando as opções de respostas de cada pergunta e fazendo um JOIN com a tabela de Resultadoes para saber qual é a opção de resposta que possui o resultado correto. Note que estou usando um SelectParameter para receber o valor de cada Pergunta, conforme o repeater é listado;
6) Um Repeater listando todas as opções de resposta e identificando qual é a resposta correta.
OBS: Não sei bem quais são seus campos nas tabelas, etc. Fiz o que eu achei que era, mas aí vê e ajusta.
- Editado André Secco [MSP] segunda-feira, 16 de novembro de 2015 20:49 Identação
- Marcado como Resposta Vando Junior sexta-feira, 20 de novembro de 2015 10:21