memoria

12 views
Skip to first unread message

Bruno Eduardo

unread,
Dec 30, 2009, 11:00:16 AM12/30/09
to firebirddotnet
boa tarde.

Cenário,
Fiz um rotina manipular arquivos de sintegra, para cada empresa criei um bd sao aproximadamente 60 bds e um 1 bd geral,  e desenvolvi uma rotina para dar manutencao nos registros , entrando empresa por empresa ficou show, ai tive a ideia de fazer as 60 empresas de uma vez, o firebird encheu a memoria do pc até estourar, detalhe é que eu conecto passo para um dataTable o resultado de um select, a memoria so esvazia qdo fecho o sistema inteiro, se fechar o formulário na limpa a memoria alguem pode me ajudar.

use o dispose e nada.

segue o codigo.

a Lógica para varrer os bds.
            Dim empresa As String
            Dim cnTemp As String
            Dim dtTemp As New DataTable

            dt = retTabela("select codigo from cad_empresa", ObjPar.CnAtual)
            For Each dr As DataRow In dt.Rows
                empresa = Format(Val(dr("codigo").ToString), "0###")
                cnTemp = Replace(ObjPar.CnAtual, "Livros.fdb", empresa + "\Livros2009.fdb", 1) 'aqui eu mudo a string para a proxima empresa
                dtTemp = retTabela(sql, cnTemp)

                For Each drTemp As DataRow In dtTemp.Rows
                    linha = New DataGridViewRow
                    linha.CreateCells(DataGridView1)
                    linha.Cells(0).Value = drTemp("auto_id").ToString.Trim
                    linha.Cells(1).Value = drTemp("descricao").ToString.Trim
                    DataGridView1.Rows.Add(linha)  
                    Application.DoEvents()
                Next
                lblStatus.Text = "Empresa " + empresa
                Application.DoEvents()
            Next

 Private Function retTabela(ByVal sql As String, ByVal str As String) As DataTable
        Dim cn As New FbConnection(str)
        Dim da As FbDataAdapter
        Dim dt As New DataTable
        Try
            cn.Open()
            da = New FbDataAdapter(sql, cn)
            da.Fill(dt)
            da.Dispose()
            cn.Close()
            cn.Dispose()
        Catch ex As Exception
            MsgBox("Erro ao efetuar a consulta " + ex.Message, MsgBoxStyle.Critical, "Aviso")
        End Try
        Return dt
    End Function




1.JPG
proc.JPG

Jeudí Prando Araújo

unread,
Dec 31, 2009, 11:08:33 AM12/31/09
to firebir...@googlegroups.com
com o firebird 2.5 de uma procedure ou execute block voce pode de uma conexao com  um banco (no caso o bd geral) se conectar a outros bancos, rodar SQL em um outro banco, talvez isso resolva a questao da memoria.

essa é uma nova extenção implementada no 2.5, na funcionalidade

EXECUTE STATEMENT

a sintaxe geral:

[FOR] EXECUTE STATEMENT <query_text> [(<input_parameters>)]
[ON EXTERNAL [DATA SOURCE] <connection_string>]
[WITH {AUTONOMOUS | COMMON} TRANSACTION]
[AS USER <user_name>]
[PASSWORD <password>]
[ROLE <role_name>]
[WITH CALLER PRIVILEGES]
[INTO <variables>]

observe a novidade na 2º linha

[ON EXTERNAL [DATA SOURCE] <connection_string>]

a sintaxe geral da <connection_string> é:

[<host_name><protocol_delimiter>]database_path

ou seja, voce pode ate criar uma tabela, onde voce cadastra um id, nome, descricao ou de qual cliente é o banco, e a string de conexao...

ex:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE TESTE
returns (
    id integer,
    nome varchar(100) collate win_ptbr)
as
declare variable caminho_bd varchar(200) collate win_ptbr;
declare variable select_sql varchar(255) collate win_ptbr;
begin
    CAMINHO_BD = 'D:\CEP.FDB';
    SELECT_SQL = 'SELECT BAIRRO_CODIGO, BAIRRO_DESCRICAO FROM BAIRRO';

    FOR EXECUTE STATEMENT SELECT_SQL
        ON EXTERNAL '127.0.0.1:' || CAMINHO_BD
        AS USER 'SYSDBA'
        PASSWORD 'masterkey'
    INTO :ID, :NOME
    DO
    BEGIN
        /* aqui voce poderia chamar outras procedures
           altera o valor dos parametros de saida
           e realizar a maioria dos processos e
           requisições ao banco de dados tudo de uma só vez */
        SUSPEND;
    END
    /* Nos meus testes retornou 28871 registros
       de um outro banco em um piscar de olhos */
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE TESTE TO SYSDBA;


qualquer duvida posta ai!

Boa Sorte!!!


2009/12/30 Bruno Eduardo <brunoe...@gmail.com>




--

Você está recebendo esta mensagem porque se inscreveu no grupo "FB.NET" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para firebir...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para firebirddotne...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/firebirddotnet?hl=pt-BR.



--


--
Jeudí Prando

Mais vale o pouco do justo, que a abundância dos ímpios.
Salmo 36,16


Jeudí Prando

unread,
Jan 26, 2010, 4:20:55 PM1/26/10
to FB.NET
e ai? testou? conseguil resolver o problema? compartilhe!!!!!

On 31 dez 2009, 14:08, Jeudí Prando Araújo <jeudipra...@gmail.com>
wrote:

> 2009/12/30 Bruno Eduardo <brunoeacam...@gmail.com>

> > firebirddotne...@googlegroups.com<firebirddotnet%2Bunsu...@googlegroups.com>

Reply all
Reply to author
Forward
0 new messages