DATAGRIDVIEW LENTO - OUTRAS LINGUAGEM RAPIDA

LEANTRONIC 27/05/2012 11:59:23
#402911
Bom dia amigos do VBmania,

Conforme muita pesquisa antigamente em relação ao filtro do datagridview com o MySQL fiz o mesmo filtrar somente o que o cliente precisa, porém essa semana eu estava em um cliente q faço somente a parte de hardware da empresa e lá eles tem um sistema em Windows que utiliza como banco de dados o Firebird e eu estava vendo o modo de trabalho deles, pqp eles carregam 30 mil item instantâneo e ainda vai a pesquisa dele selecionando a linha para qual ele pesquisou (EX: PESQUISOU MONICA E APARECE OS MONICA NA GRID POREM JA SELECIONADO NO MEIO DA GRID PODENDO DESCENDO E PROCURANDO OUTROS ITENS QUE COMEÇA COM NAVIO E SUBINDO ATé A LETRA B OU A), porém carregando todos os itens e ele podendo ir descendo e encontrar outros produtos, mto bom mesmo!

Será possivel fazer isso com o vb.net e o MySQL, pelo oq vi o sistemas dele trabalha parecida com a buscas efetuadas no antigos sistema em DOS (utilizando indices)

Bem amigos é isso valeu
AJSO 27/05/2012 12:35:53
#402913
Caro LEANTRONIC

Sim realmente é possivel e os objetos dentro dos atuais framework está realmente cada verz mais rápido se utilizar ADO.Net pode perfeitamente obter resultados expressivos quan a dinâmica de consulta e filtro para descarregar no Datagridview, basta obter o DATA PROVIDER de sua fonte de dados.



Boa Sorte
LEANTRONIC 27/05/2012 13:00:01
#402916
Caro AJSO agradeço a resposta e tenho algumas duvidas,

Sou novato em vb.net, porém ja consigo fazer muitas coisas, na epoca que começei meu projeto tinha um amigo meu me ajudando e ele cuidou dessa parte de conexão com o MySQL e desde hoje utilizo a solução que ele implantou, hj minha classe de conexão ao mysql esta assim


Imports MySql.Data.MySqlClient

Dim CONEXAO As String = [Ô]server=[ô][Ô] & SERVER & [Ô][ô][Ô] & _
[Ô];user id=[ô][Ô] & USUARIO & [Ô][ô][Ô] & _
[Ô];password=[ô][Ô] & PASSW & [Ô][ô][Ô] & _
[Ô];database=[ô][Ô] & DATAB & [Ô][ô][Ô] & _
[Ô];Allow Zero Datetime=True[Ô]

Public OBJCON As New MySqlConnection(CONEXAO)
Public OBJCMD As New MySqlCommand

Public Sub ABRIR()
Try
OBJCON.Open()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

[ô]FECHAR BANCO
Public Sub FECHAR()
If OBJCON.State = ConnectionState.Open Then
OBJCON.Close()
End If
End Sub


Public Sub EXECUTAR_COMMANDO(ByVal SQL As String)
Dim OBJCMD As New MySqlCommand(SQL, OBJCON)
ABRIR()
OBJCMD.ExecuteNonQuery()
FECHAR()
End Sub

deduzo que não estou utilizando ADO.net pq vi que tem sempre q instalar um connector certo ao instalar a aplicação na maquina e desse modo que trabalho eu somente instalo o MySQL Administrator junto com o MySQL no Servidor e defino as permissões para quais estações vai acessar e pronto.

Nas maquinas client eu somente instalo o netframework qndo necessario

Gostaria de sua opinião sobre oq falei... se falei alguma ou estou certo porém tenho q mudar o meu modo de consulta
LEANTRONIC 27/05/2012 13:04:21
#402917
Hoje eu preencho uma datagridview assim


Public Function Pesq_NomeProdBasico(ByVal Campo As String) As DataTable

Sql = ([Ô]Select Codigo AS [ô]Cod[ô], Descricao as [ô]Produto[ô], Aplicacao, Tipo,EstoqAtual as [ô]Estoque[ô],ValUnitVend as [ô]Valor[ô] from Produtos where Descricao like [ô][Ô] & Campo & [Ô]%[ô] order by Descricao asc[Ô])

Objbanco.OBJCON.Open()
Dim objda As New MySqlDataAdapter(Sql, Objbanco.OBJCON)
objdt.Clear()
objds.Tables.Clear()
objda.Fill(objds, [Ô]Produtos[Ô])
objdt = objds.Tables([Ô]Produtos[Ô])

Objbanco.OBJCON.Close()
Return objdt
End Function

e na datagrid view eu só coloco o

dgditens.datasource = objpesqprodutos.Pesq_NomeProdBasico(txtpesq.text)

porém em algum momento preciso que ele carregue todos os itens da tela ai eu tiro o where da instrução e vem os 30 mil itens porém demora uns 3 a 5 segundo dependendo da maquina do cliente, na minha demora 2 segundo mas tem cliente q tem maquina mais antiga q é complicado e o foda é ver o sistemas antigos dele mais rapido q o meu, ai fica foda falar para o cliente trocar a maquina :/
KERPLUNK 28/05/2012 09:44:59
#402939
Resposta escolhida
1 - Se usar os objetos CORRETOS para leitura de dados, o DataReader, a consulta tem uma melhora significativa de desempenho. O que você está usando(dataTables) é com certeza bem mais lento, pois é um objeto projetado não só para leitura, mas outras operações também.
2 - Usando modo procedural(como você está fazendo), também contribui para um desempenho fraco.

Concluindo, você precisa aprimorar o modo como programa, não só tecnicamente, mas também conceitualmente.
OCELOT 28/05/2012 10:01:09
#402943
No .Net sei que você pode usar o VirtualMode do DataGridView para melhorar o desempenho, com ele você pode carregar menos registros e o grid mostra a barra de rolagem como se tivesse mais registros e então você usa alguns eventos para saber quando tem que carregar os registros, você poderia por exemplo carregar cerca de 50 registros e quando o usuário rolasse o grid ele iria pedindo mais registros para você.
KERPLUNK 28/05/2012 10:10:38
#402945
Citação:

No .Net sei que você pode usar o VirtualMode do DataGridView para melhorar o desempenho, com ele você pode carregar menos registros e o grid mostra a barra de rolagem como se tivesse mais registros e então você usa alguns eventos para saber quando tem que carregar os registros, você poderia por exemplo carregar cerca de 50 registros e quando o usuário rolasse o grid ele iria pedindo mais registros para você.


Já está pensando da maneira errada. Isso não é melhorar desempenho, é mascarar um problema.
LEANTRONIC 28/05/2012 20:11:29
#403023
Amigos, primeiro quero agradecer o interesse de ajudar...

KERPLUNK então no caso seria melhor em vez de usar essa rotina :
[txt-color=#0000f0]
Public Function Pesq_NomeProdBasico(ByVal Campo As String) As DataTable

Sql = ([Ô]Select Codigo AS [ô]Cod[ô], Descricao as [ô]Produto[ô], Aplicacao, Tipo,EstoqAtual as [ô]Estoque[ô],ValUnitVend as [ô]Valor[ô] from Produtos where Descricao like [ô][Ô] & Campo & [Ô]%[ô] order by Descricao asc[Ô])

Objbanco.OBJCON.Open()
Dim objda As New MySqlDataAdapter(Sql, Objbanco.OBJCON)
objdt.Clear()
objds.Tables.Clear()
objda.Fill(objds, [Ô]Produtos[Ô])
objdt = objds.Tables([Ô]Produtos[Ô])

Objbanco.OBJCON.Close()
Return objdt
End Function
[/txt-color]
usar essa?

[txt-color=#0000f0]
Public Function Pesq_NomeProdBasico(ByVal Campo As String)

Sql = ([Ô]Select Codigo AS [ô]Cod[ô], Descricao as [ô]Produto[ô], Aplicacao, Tipo,EstoqAtual as [ô]Estoque[ô],ValUnitVend as [ô]Valor[ô] from Produtos where Descricao like [ô][Ô] & Campo & [Ô]%[ô] order by Descricao asc[Ô])

Dim objda As MySqlDataReader
Dim OBJCMD As New MySqlCommand(SQL, ObjBanco.OBJCON)
ObjBanco.OBJCON.Open()
objda = OBJCMD.ExecuteReader

objdt.Load(objda)

return objda

[/txt-color]
end function
LEANTRONIC 28/05/2012 20:13:02
#403024
OBS: em uma eu uso o [txt-color=#e80000]MySqlDataAdapter [/txt-color]e na outra o [txt-color=#e80000]MySqlDataReader[/txt-color]

Citação:

:.
2 - Usando modo procedural(como você está fazendo), também contribui para um desempenho fraco.

Concluindo, você precisa aprimorar o modo como programa, não só tecnicamente, mas também conceitualmente.



Cara hj eu trabalho colocando tudo dentro de uma classe e só chamo a função pra executar, ja deixo o comando sql tudo dentro da Classe e quando quero executar eu só chamo a função que está dentro do meu objeto. ex:

Qndo chamo aquela função que mostrei acima sempre no formulario principal eu declaro a classe Dim ObjProdutos as new ClsProdutos

e chamo ela assim

dtprodutos.datasource = objprodutos.Pesq_NomeProdBasico(txtpesq.text)

é esse caso que vc fala que tenho q aprimorar o meu modo de programar?
Tópico encerrado , respostas não são mais permitidas