Jump to content
Sign in to follow this  
vastri

[Resolvido] Carregar dados da bd sql parcialmente

Recommended Posts

vastri

olá a todos,

Estou a construir uma aplicação para desktop com uma bd sql num servidor web, utilizo os objetos do VS2010 (bidingsource, tableadapter) para carregar dados da bd com o método fill, queria mostrar ao utilizador a quantidade de registos (ex. X registos) consoante o critério de seleção do utilizador sem ter que carregar para o lado cliente todos os dados da bd.

Para fácil entendimento vejam este site de carros www.mobile.de na versão inglesa Search » Cars quase imediato a pagina é carregada e Your search had 1,520,412 results se alterar qualquer critério na pesquisa como por exemplo selecionar uma marca ex. Audi resulta imediatamente Your search had 113,459 results se continuarmos a alterar o critério de pesquisa o resultado aparece imediatamente sem parecer existir consulta à bd, era isto que queria fazer mas não estou a conseguir sem carregar todos os dados para o lado cliente, alguém me pode dar uma dica como fazer, qual o método!! Pela velocidade de acesso aos dados não acredito que os 1.520.412 registos estejam já do lado cliente à certamente um método associado para que isto aconteça... resta saber qual!!!

Até pode ser básico para os "experts" mas eu sou iniciante :confused: ajuda p.f.

Share this post


Link to post
Share on other sites
nelsonr

Podes tentar usar stored procedures em que fazes 2 selects. Um com o count para ver quantos registos resultam do filtro e outro com os X primeiros resultados.

Share this post


Link to post
Share on other sites
bioshock

O que eu faço é carregar inicialmente todos os dados para dentro de um DataSet. Depois filtro a pesquisa dentro do DataSet, pelo que não tenho que aceder novamente à base de dados. E a performance é imediata.

Share this post


Link to post
Share on other sites
vastri

obrigado nelsonr, como disse sou iniciante e ainda não cheguei ás stored procedures mas vou aprofundar a coisa provavelmente chego lá, tenho que fazer o query (stored procedure) no SQL, correcto? Mas mesmo assim sempre que o lado cliente alterar o critério de pesquisa não tenho que fazer a consulta à stored procedure? Se vires o site que dei no exemplo parece não acontecer nada na alteração da pesquisa!! Desculpa a "nabice" mas estou mesmo a zero neste tipo de procedimento.

obrigado bioshock, era o que estava a fazer mas lá esta tens que passar todos os dados para o lado do cliente, no site exemplo que dei eles tem mais que 1 milhão de registos se carregas tudo no DataSet vai levar bastante tempo, é claro que eu não irei ter esta quantidade de registos nem perto, criei uma rotina para mandar cerca de 10.000 registos para a bd o DataSet carrega com alguma rapidez e depois claro manipulas com performance imediata o que é bom também, mas o método do exemplo causou-me alguma curiosidade pois parece que é um procedimento bom para grande quantidade de dados.

Share this post


Link to post
Share on other sites
bioshock

Metes-lhe um backgroundworker a funcionar, ainda mais rápido fica. E não tens quebras de performance na aplicação.

Sinceramente não estou a ver outro método melhor.

Relativamente ao site, pelo que estive a ver na troca de página dos resultados (ou seja, mudar da página 1 para a 2), demora-me em média 3/4 segundos. Pelo que, pelo menos na aplicação, não chega a tanto.

Share this post


Link to post
Share on other sites
nelsonr

Pelo que me pareceu, o site após alteração do filtro apenas atualiza o contador com o total de resultados. Isso é um select com o count apenas.

Depois de confirmar vai buscar apenas os visiveis por pagina, que sao cerca de 20.

Isso assim é bastante rápido, porque nunca precisa de ler os registos todos.

A ideia de usares stored procedures era se precisasses de fazer várias operações na base de dados, em que era tudo feito do lado do servidor SQL em vez de andar para tras e para a frente com informação.

Share this post


Link to post
Share on other sites
vastri

bioshock, sim com os backgroundworker ainda melhora, para "poucos" dados na bd a tua pratica parece a mais indicada e sem duvida com os dados no DataSet a partir dai tudo roda a velocidade imediata, não leves a mal estar a bater na tecla da outra solução quando a tua está correta mas é uma questão de curiosidade sei que a vou necessitar de implantar mais sedo ou mais tarde e por outro lado fico f... quando vejo aplicado e não sei como!

nelsonr, vê ou corrige o meu raciocínio, mesmo sendo um select apenas com o count tem que ser "lidos" muitos registos do select para chegar ao resultado do count!? Se vires no site quando mudas o critério de pesquisa o count é apresentado imediatamente sem parecer acontecer nada, certamente estou errado algo tem que acontecer.

Share this post


Link to post
Share on other sites
nelsonr

Mas experimentaste fazer só o select do count usando vários filtros?

Demora assim tanto tempo?

Depois também depende um bocado dos campos usados no filtro. Convêm estar indexados

Share this post


Link to post
Share on other sites
vastri

nelsonr, isto por vezes com iniciantes tens que explicar tudo :(, simplesmente eu não sabia sequer que existia um select somente para o count, estavas no caminho correto mas eu não o estava a entender, só tinha em mente fazer o count baseado nos dados carregados o que estava errado, como as tuas dicas não iam neste sentido lá descobri o tal select e fez-se luz.

ficaria algo do género:

    Dim Conn As SqlConnection = New SqlConnection(connectionString)
    Try
	    Conn.Open()
	    Dim strSQL As String = "SELECT COUNT(*) FROM diving_dtb.discrepancy WHERE " & Query_Pesq & ""
	    Dim cmdScalar As SqlCommand = New SqlCommand(strSQL, Conn)
	    cmdScalar.CommandType = CommandType.Text
	    Dim TotalRegistos As Integer = CInt(cmdScalar.ExecuteScalar)
	    lblRegistos.Text = TotalRegistos
    Catch ex As Exception
	    MsgBox(ex.Message)
    Finally
	    Conn.Close()
    End Try

e bingo o resultado aparece quase de forma imediata penso que é isto que acontece no site exemplo, o enigma está desvendado, obrigado :thumbsup: .

já agora se não for pedir muito p.f. vê se a sintaxe/método está correto.

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×
×
  • 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.