FIREBIRD NãO LIBERA ARQUIVO DO BD

 Tópico anterior Próximo tópico Novo tópico

FIREBIRD NãO LIBERA ARQUIVO DO BD

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#496221 - 10/02/2021 17:29:48

MFLAVIO
CAMPINAS
Cadast. em:Maio/2009


Última edição em 10/02/2021 17:31:15 por MFLAVIO

Ola gente eu travezzzzz.

preciso de um norte
estamos criado um APP, que verifica alguns arquivos enviados pelos nossos clientes

dentre os arquivos recebemos um banco de dados (firebird)
eu faço a conexão a esse arquivos dessa forma

    
    Public conexaoFB As FbConnection ' esta esta declarada no cabeçario do Modulo

Public Sub Conecta(Svalor As Boolean)
        Dim IP, DB, cString As String
        Try
            If Svalor = True Then
                IP = '127.0.0.1'
                DB = sPath & '\fecha\dic.fdb'
                cString = 'User=SYSDBA;Password=masterkey;Database=' & DB & ';DataSource=' & IP & ';ConnectionTimeout=30;Port=3050;Dialect=3'
                conexaoFB = New FbConnection(cString)
                conexaoFB.Open()
            Else
                conexaoFB.Close()
                conexaoFB.Dispose()
            End If
        Catch ex As Exception
            SAviso = '***Atenção Erro ao Conectar a Base de dados***' & vbCrLf & ex.Message
            Aviso.ShowDialog()
            Err.Clear()
        End Try

    End Sub

esta normal
a única coisa e que mesmo executando o comando Close e Dispose na conexão
o arquivo do Banco de dados continua em uso , ou seja não consigo mover ele para outra pasta
so consigo usar o Arquivo do Banco se eu fechar o APP

alguém sabe como consigo liberar o Arquivos sem fechar o APP?


Deus e o maior dos Programadores, ele criou tudo em liguagem visual
                                           .... e viu Deus que era bom


#496222 - 10/02/2021 18:02:48

OMAR2011
MONTES CLAROS
Cadast. em:Setembro/2011


Última edição em 10/02/2021 18:04:06 por OMAR2011

Tem que fechar a conexão.
Verdadeiro,sempre estará aberta.
Usa o Using.Terminado o código
fecha conexão sem precisar de Close.




#496223 - 10/02/2021 18:12:44

MFLAVIO
CAMPINAS
Cadast. em:Maio/2009


Citação:
:
Tem que fechar a conexão.
Verdadeiro,sempre estará aberta.
Usa o Using.Terminado o código
fecha conexão sem precisar de Close.

cara a te tentei usar o Bloco Using

mais não consegui da erro
e não aceita as variaveis do Firebird


Deus e o maior dos Programadores, ele criou tudo em liguagem visual
                                           .... e viu Deus que era bom


#496224 - 10/02/2021 18:17:22

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Seu problema é estrutural. Não deveria ser um método 'conecta' que realmente conecta algo. Você deveria ter uma função que retorna um objeto do tipo 'FbConnection' já configurado. Esse objeto deveria ser o que o bloco using processa. A conexão é aberta dentro do bloco using e será fechada e descartada no final do mesmo.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#496225 - 10/02/2021 18:26:37

MFLAVIO
CAMPINAS
Cadast. em:Maio/2009


Citação:
:
Seu problema é estrutural. Não deveria ser um método 'conecta' que realmente conecta algo. Você deveria ter uma função que retorna um objeto do tipo 'FbConnection' já configurado. Esse objeto deveria ser o que o bloco using processa. A conexão é aberta dentro do bloco using e será fechada e descartada no final do mesmo.

Mais CONECTA e o nome da sub Que faz a Conexão,

eu realmente não estou sabendo criar a conexão Usando Bloco USING

estou pesquisando no google tentando achar algum exemplo


Deus e o maior dos Programadores, ele criou tudo em liguagem visual
                                           .... e viu Deus que era bom


#496226 - 10/02/2021 19:05:43

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe

Última edição em 10/02/2021 19:17:05 por KERPLUNK

Isso é porque você não está usando OOP, Só por mencionar 'cabeçalho de módulo', é forte indício disso. Aqui um exemplo simples:

Public Class Program
    Public Shared Sub Main()
        Using cn As FbConnection = New Firebird.GetConnection()

            Try
                cn.Open()
                'Aqui a conexão chamada 'cn' estará aberta e disponível para ser usada com o que quiser. Ela é o alvo do bloco using e portanto será fechada e descartada quando o bloco terminar
            Catch ex As Exception
            End Try
        End Using
    End Sub
End Class

Public Class Firebird
    Public Function GetConnection() As FbConnection
        Dim _return As FbConnection = New FbConnection()
        _return.ConnectionString = 'bla bla sua connection string'
        Return _return
    End Function
End Class



_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#496227 - 11/02/2021 10:13:58

MFLAVIO
CAMPINAS
Cadast. em:Maio/2009


Citação:
:
Isso é porque você não está usando OOP, Só por mencionar 'cabeçalho de módulo', é forte indício disso. Aqui um exemplo simples:

Public Class Program
    Public Shared Sub Main()
        Using cn As FbConnection = New Firebird.GetConnection()

            Try
                cn.Open()
                'Aqui a conexão chamada 'cn' estará aberta e disponível para ser usada com o que quiser. Ela é o alvo do bloco using e portanto será fechada e descartada quando o bloco terminar
            Catch ex As Exception
            End Try
        End Using
    End Sub
End Class

Public Class Firebird
    Public Function GetConnection() As FbConnection
        Dim _return As FbConnection = New FbConnection()
        _return.ConnectionString = 'bla bla sua connection string'
        Return _return
    End Function
End Class



cara usei o bloco de comandos
mais mesmo após terminar o Bloco (using)
o arquivos continua em uso
e ja verifiquei a Conexão esta fechada (status =0)

          
Public Function Valida() As String
  If Grid_cli.RowCount <= 0 Then Exit Sub
        Dim CMD As FbCommand
        Dim DR As FbDataReader
        Dim IDFecha As String
        Dim Sfile As String
        Dim IP, DB, cString As String
        IP = '127.0.0.1'
        DB = sPath & '\fecha\dic.fdb'
        cString = 'User=SYSDBA;Password=masterkey;Database=' & DB & ';DataSource=' & IP & ';ConnectionTimeout=30;Port=3050;Dialect=3'

        SQL = ''
        SQL = 'select * from informacoes where((status)='Aberto')'

        CMD = New FbCommand(SQL, ConexaoROOT)
        DR = CMD.ExecuteReader
        Do While DR.Read
            Using CONECTAFB As New FbConnection(cString)

                LErro = ''
                LST_info.Items.Clear()
                BT_Finaliza.Visible = False
                Try
                    Directory.Delete('C:\Fecha', True)' o erro sempre acontece aqui não e possível apagar o BD,
                Catch ex As Exception
                    Err.Clear()
                End Try

                BT_Executa.Enabled = False

                IDFecha = Trim(DR('id').ToString)
                Sfile = PegaArquivoRAR(Trim(DR('pasta').ToString))
                If Sfile = 'OFF' Then
                    LErro = 'Arquivo de Backup Não Localizado'
                    GoTo proximo
                End If
                LST_info.Items.Add('Iniciando Fechamento')
                LST_info.Items.Add(Trim(DR('nome').ToString))

                If Sfile <> '' Then
                    DescompactaArquivo(Sfile)
                    If File.Exists(sPath & '\fecha\dic.fdb') Then
                        LST_info.Items.Add('Base de dados Localizada')
                        LST_info.Items.Add('Analizando Base de dados')
                    Else
                        LST_info.Items.Add('Base de dados não Localizada verifique o Arquivo')
                    End If
                    Compacta(My.Computer.FileSystem.SpecialDirectories.Desktop & '\' & sEmp)
                    If Directory.Exists(My.Computer.FileSystem.SpecialDirectories.Desktop & '\' & sEmp) Then
                        System.IO.Directory.Delete(My.Computer.FileSystem.SpecialDirectories.Desktop & '\' & sEmp, True)
                    End If
                    System.Threading.Thread.Sleep(300)
                    LST_info.SelectedIndex = LST_info.Items.Count - 1
                    Me.Refresh()

                    LST_info.Items.Add('Enviando email')
                    Pnome = ''
                    Dim CLS_EnviaMail As New Envia_Email
                    Envia_Email.EnviaEmail('', Trim(DR('email').ToString), 'Fechamento ->' & Trim(DR('nome').ToString), My.Computer.FileSystem.SpecialDirectories.Desktop & '\' & sEmp & '.rar')
                    LErro &= Pnome
                    System.Threading.Thread.Sleep(300)
                    LST_info.SelectedIndex = LST_info.Items.Count - 1
                    Me.Refresh()
proximo:
                    Try
                        If File.Exists(My.Computer.FileSystem.SpecialDirectories.Desktop & '\' & sEmp & '.rar') = True Then
                            Kill(My.Computer.FileSystem.SpecialDirectories.Desktop & '\' & sEmp & '.rar')
                        End If
                    Catch ex As Exception
                        Err.Clear()
                    End Try
                    Conecta(False)
                    AtualizaListaAUTOMATIZADA(Trim(DR('id').ToString))
                    CarregaRoot()
                    System.Threading.Thread.Sleep(300)
                    Me.Refresh()
                End If
            CONECATFB.close
            End Using
        Loop
        Return Log
   End Function
  

eu pensei em dar um stop no FirebirdServer, nos serviços do Windows e depois Reiniciar
mais isso iria derrubar todas as outras conexões dos outros aplicativos
então não tem como.
e ja testei, para ver se não e outros recursos usando o Arquivo, mais não e, o que prende o arquivo e justamente a Conexao com BD, mesmo com a conexão finalizada

Deus e o maior dos Programadores, ele criou tudo em liguagem visual
                                           .... e viu Deus que era bom


#496230 - 11/02/2021 12:20:23

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Se há outras conexões ao banco, não tem outra maneira se não derrubar todos.
Além disso, no seu código aí em cima, você tem DUAS conexões ao banco, acho que você ainda não entendeu o que é o bloco using e nem a OOP.

Que tal assistir os vídeos da série sobre isso no meu canal?

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#496231 - 11/02/2021 12:37:16

MFLAVIO
CAMPINAS
Cadast. em:Maio/2009


Citação:
:
Se há outras conexões ao banco, não tem outra maneira se não derrubar todos.
Além disso, no seu código aí em cima, você tem DUAS conexões ao banco, acho que você ainda não entendeu o que é o bloco using e nem a OOP.

Que tal assistir os vídeos da série sobre isso no meu canal?


Sim são 2 Conexoes mesmo
1. conexão e com nosso banco de dados onde tem as informações(Nosso servidor)
2. e com um arquivo que recebemos via FTP do Terminal do Cliente, e nessa que da o B.O

como viu existe um LOOP (basicamente esse APP e so esse loop) esse app e disparado pelas GPO do Domínio do nosso servidor
o app le informações do BD enviado por FTP, e sincroniza algumas informações com Nosso Banco de dados, em alguns casos e envia por email um aviso de erros em procedimentos ao cliente
com os dados do DB em anexo

tudo Funciona, so que o LOOP trava quando tento apagar o DB da conexão 2, para poder descompactar o Arquivo de próximo Cliente

Não fui o Criador desse APP
Originalmente o APP, vai descompactando os arquivos recebidos em Diretórios Diferentes tipo c:\fecha\PAST1, no próximo vai para PAST2 e assim por diante
o que acontece que tem hora que tem uma infinidade de pastas no Nosso servidor e começa atrapalhar
ai vou la e apago o Diretório, passo um Defrag no disco e tal

so queria melhorar o APP para não ficar esse monte de pastas no diretório, já que elas não são mais uteis
com isso Diminuir a necessidade de manutenção neste servidor.


Deus e o maior dos Programadores, ele criou tudo em liguagem visual
                                           .... e viu Deus que era bom


#496232 - 11/02/2021 14:35:02

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Pois então, você precisa de um manejo correto de abertura e fechamento, tanto de arquivos quanto de conexões com o banco e o melhor jeito de fazer isso é usando OOP.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário