Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cjfester

Vb + MySQL + RDO

Recommended Posts

Não consigo trabalhar com grandes volumes de dados, eu digo grandes mesmo (34 milhões de registros * 40 campos). :wacko:

 

Public db As New rdoConnectionPublic rs, rs1, rs2 As rdoResultsetPublic coluna As rdoColumnPublic qry as rdoQueryPrivate Sub Form_Load()   With db	  .Connect = "DSN=MySQL;UID=root;PWD=root;DATABASE=parrudo;"	  .CursorDriver = rdUseIfNeeded	  .EstablishConnection Prompt:=rdDriverNoPrompt   End WithEnd Sub
Até aí beleza, faço a conexão e consigo rodar um monte de de sql via db.execute.

 

O problema é que tenho que montar uma rotina que vai modificar dados nessa tabela enorme, e quando digo modificar, é ler registro a registro, e conforme valores de determinados campos, altero o conteúdo dos campos x e y, e conforme o conteúdo, altero y e z, além de trabalhar com funções não suportadas no "sql do mysql". Não tem como fazer uma SQL do tipo UPDATE, definitivamente.

 

Eis que tento usar o OpenResultSet (a exemplo de um OpenRecordSet) para ler a tabela e dentro de um laço de repetição fazer as comparações e alterações necessárias. Só que essa tabelinha tá usando mais de 6GB de espaço, e pelo que parece o OpenResultSet tenta abrir todo o conteúdo dela na memório ... logo, erro (memory out of ran).

 

 

Private Sub Command3_Click()   Set qry = db.CreateQuery("LongQuery", "SELECT * from tabelao")   qry.MaxRows = 500		Set rs1 = qry.OpenResultset(rdOpenDynamic, rdConcurValues, rdAsyncEnable)	rs1.MoveFirstWhile Not rs1.EOF		 'if isso ... If aquilo .... aplica fórmulas e funções ... gera variável resultado		 rs1.Edit		 rs1("campo_tal").Value = resultado		 rs1.update		 rs1.MoveNextWend   rs1.Close   qry.CloseEnd Sub
Neste exemplo dá problema com os registros (ou read-olnly ou simplesmente não atualizam no db), porém não dá erro de memória porque delimito a 500 registros "por rodada" digamos assim. Deve estar errado alguma coisa de cursor e locktype ... não consigo entender o manual ... arghhh

 

1) Alguém aí tem uma noção de como resolvo esse abacaxi ?

 

2) RDO é o melhor componente pra isso ou uso algum outro, tipo ADO, que é mais fácil ?

 

3) Estou no caminho certo mas to errando nos detalhes dos parâmetros ??

 

http://forum.imasters.com.br/public/style_emoticons/default/searchbeforeposting.gif http://forum.imasters.com.br/public/style_emoticons/default/skull.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites
  cjfester disse:

Não consigo trabalhar com grandes volumes de dados, eu digo grandes mesmo (34 milhões de registros * 40 campos). :wacko:

 

Public db As New rdoConnectionPublic rs, rs1, rs2 As rdoResultsetPublic coluna As rdoColumnPublic qry as rdoQueryPrivate Sub Form_Load()   With db	  .Connect = "DSN=MySQL;UID=root;PWD=root;DATABASE=parrudo;"	  .CursorDriver = rdUseIfNeeded	  .EstablishConnection Prompt:=rdDriverNoPrompt   End WithEnd Sub
Até aí beleza, faço a conexão e consigo rodar um monte de de sql via db.execute.

 

O problema é que tenho que montar uma rotina que vai modificar dados nessa tabela enorme, e quando digo modificar, é ler registro a registro, e conforme valores de determinados campos, altero o conteúdo dos campos x e y, e conforme o conteúdo, altero y e z, além de trabalhar com funções não suportadas no "sql do mysql". Não tem como fazer uma SQL do tipo UPDATE, definitivamente.

 

Eis que tento usar o OpenResultSet (a exemplo de um OpenRecordSet) para ler a tabela e dentro de um laço de repetição fazer as comparações e alterações necessárias. Só que essa tabelinha tá usando mais de 6GB de espaço, e pelo que parece o OpenResultSet tenta abrir todo o conteúdo dela na memório ... logo, erro (memory out of ran).

 

 

Private Sub Command3_Click()   Set qry = db.CreateQuery("LongQuery", "SELECT * from tabelao")   qry.MaxRows = 500		Set rs1 = qry.OpenResultset(rdOpenDynamic, rdConcurValues, rdAsyncEnable)	rs1.MoveFirstWhile Not rs1.EOF		 'if isso ... If aquilo .... aplica fórmulas e funções ... gera variável resultado		 rs1.Edit		 rs1("campo_tal").Value = resultado		 rs1.update		 rs1.MoveNextWend   rs1.Close   qry.CloseEnd Sub
Neste exemplo dá problema com os registros (ou read-olnly ou simplesmente não atualizam no db), porém não dá erro de memória porque delimito a 500 registros "por rodada" digamos assim. Deve estar errado alguma coisa de cursor e locktype ... não consigo entender o manual ... arghhh

 

1) Alguém aí tem uma noção de como resolvo esse abacaxi ?

 

2) RDO é o melhor componente pra isso ou uso algum outro, tipo ADO, que é mais fácil ?

 

3) Estou no caminho certo mas to errando nos detalhes dos parâmetros ??

 

http://forum.imasters.com.br/public/style_emoticons/default/searchbeforeposting.gif http://forum.imasters.com.br/public/style_emoticons/default/skull.gif

cjfester,

 

Faz assim:

Set pgrs = New ADODB.Recordset

sql = "select * from produto"

pgrs.Open sql, gconexao, adOpenKeyset, adLockPessimistic

gconexao.Execute sql

 

A opção do record deve ser igual a : adOpenKeyset, adLockPessimistic

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso esses registros tenha id,chave primária ou algo que identifique cada um você pode fazer com updates (isso dentro dos ifs) ou isso também não dá?Oura coisa, você também pode usar o "parâmetro limit" na sua sintaxe sql:"select * from tabela limit 0,499" pegaria os primeiros 500 ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.