none
Porque o Dataset com TableAdapter esta quadruplicando as informações? RRS feed

  • 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?

    domingo, 1 de novembro de 2015 16:56

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
    segunda-feira, 2 de novembro de 2015 02:03
  • 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
    segunda-feira, 16 de novembro de 2015 20:41

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
    segunda-feira, 2 de novembro de 2015 02:03
  • 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.

    segunda-feira, 2 de novembro de 2015 22:07
  • 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.

    quinta-feira, 5 de novembro de 2015 22:50
  • 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. 
    segunda-feira, 9 de novembro de 2015 14:12
  • 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
    segunda-feira, 16 de novembro de 2015 20:41