COMO FECHAR TODAS AS CONEXOES ABERTAS NUMA BD

PROGRAMADORVB6 08/03/2012 06:33:55
#396657
Olá bom dia.
Estou a desenvolver uma aplicação com base de dados,contudo estou tendo problemas com uma função que fiz, pois ela não faz mais do que encapsular a minha base de dados quando abandono a minha aplicação.
- Reparei então que as chamadas feitas para acesso á base de dados , não tinham sido todas fechadas antes do abandono da aplicação, pois só assim a minha função poderá trabalhar no ficheiro.
- Fui então passo a passo ver onde se encontravam abertas, para as poder fechar.
- Pensei que na net houvesse material abordando este meu problema, mas o que encontrei foi só a explicação que dentro de uma função de conexão elaborada teria conexão.Open() e no seu procedimento final era composta por uma instrução conexão.Close() [ Como mostra a Sub Procura_Valores()].
-Em VB6 recordo-me que havia uma função que fazia o varrimento para detectar se haveria alguma conexão ainda aberta, caso afirmativo procedia ao seu fecho.
-Existe algum modo de fazer o mesmo em VB.net?
Para terem uma ideia deixo aqui parte do código da minha aplicação:

 Imports System.Data.OleDb
Module Ligacao_BD

Public Ligacao As New OleDbConnection
Public ConString As String = [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[Ô] & My.Application.Info.DirectoryPath & [Ô]\Folha.mdb[Ô]
Public Sub AbrirBD()
If My.Computer.FileSystem.FileExists(My.Application.Info.DirectoryPath & [Ô]\Folha.mdb[Ô]) Then
Try
Ligacao.ConnectionString = ConString.ToString
Ligacao.Open()
Catch ex As Exception
MessageBox.Show([Ô]Erro descrição : [Ô] & vbCrLf & ex.Message & vbCrLf, [Ô]Informação : [Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try
Else
Ligacao.Close()
MessageBox.Show([Ô]Erro descrição : Ficheiro da base de dados não encontrado. [Ô], [Ô]Informação : [Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
End
End If
End Sub

Public Sub FecharBD()
Ligacao.Close()
End Sub

Public Sub Procura_Valores(ByVal pSQL As String)
If Ligacao.State = ConnectionState.Closed Then
Ligacao.Open()
End If

Dim reader As OleDbDataReader
Dim oCmd As OleDbCommand = Ligacao.CreateCommand()
oCmd.CommandText = [Ô]SELECT * FROM FolhaLab WHERE ID LIKE [ô][Ô] & pSQL.ToString & [Ô]%[ô] ORDER BY ID desc [Ô]
reader = oCmd.ExecuteReader

Try
While reader.Read
RegistoH.DateTimePicker1.Text = reader([Ô]Data[Ô])
RegistoH.Caixa_Nome.Text = reader([Ô]Nome[Ô])
RegistoH.Caixa_Razao.Text = reader([Ô]Razao[Ô])
RegistoH.Caixa_Piso.Text = reader([Ô]Piso[Ô])
RegistoH.Caixa_Entrada.Text = reader([Ô]Entrada[Ô])
RegistoH.Caixa_Saida.Text = reader([Ô]Saida[Ô])
RegistoH.Caixa_Empresa.Text = reader([Ô]Empresa[Ô])
End While
Catch ex As Exception
MessageBox.Show([Ô]Erro descrição : [Ô] & vbCrLf & ex.Message & vbCrLf, [Ô]Informação : [Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
reader.Close()
End Try
End Sub
End Module


 [ô]Formulário
Imports System.Text
Public Class RegistoH

Private Sub RegistoH_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If ObjFuncoes.ExisteFicheiro(Application.StartupPath & [Ô]\Folha.Mep[Ô]) = True Then
Escudo.Desproteger_Ficheiro(Application.StartupPath & [Ô]\Folha.Mep[Ô], Application.StartupPath & [Ô]\Folha.mdb[Ô])
End If
Application.DoEvents()

AbrirBD()

End Sub
Private Sub RegistoH_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
FecharBD()
Application.DoEvents()
If ObjFuncoes.ExisteFicheiro(Application.StartupPath & [Ô]\Folha.mdb[Ô]) = True Then
Escudo.Proteger_Ficheiro(Application.StartupPath & [Ô]\Folha.mdb[Ô], Application.StartupPath & [Ô]\Folha.Mep[Ô])
End If
End Sub

rivate Sub TabSair_Click(sender As System.Object, e As System.EventArgs) Handles TabSair.Click
FecharBD()
Application.DoEvents()
If ObjFuncoes.ExisteFicheiro(Application.StartupPath & [Ô]\Folha.mdb[Ô]) = True Then
Escudo.Proteger_Ficheiro(Application.StartupPath & [Ô]\Folha.mdb[Ô], Application.StartupPath & [Ô]\Folha.Mep[Ô])
End If
Me.Close()
End Sub
Private Sub RegistoH_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
FecharBD()
Me.Dispose()
End Sub
End Class


Grato desde já pela vossa atenção.
Atentamente.
Programadorvb6
WEBSTERGONTIJO 08/03/2012 07:26:45
#396658
Parceiro bom dia..


Tenta fazer assim

If Me.Ligacao.State = ConnectionState.Open Then
Ligacao.Close()
End If

Ligacao.Open()

No caso ai ele verifica o estado da sua ligacao (Conexao) se ela ja tiver aberta ele fecha a conexao aberta com o banco e manda abrir de novo para fazer a nova.
Assim vai evitar o erro que da quando tenta abrir uma conexao que ja ta aberta...

Abraços
MITSUEDA 08/03/2012 07:31:36
#396659
Eu também sofri com esse problema...

Eu passei a utilizar a clausua Using

E dar close em todas as chamadas
ROBIU 08/03/2012 08:44:18
#396661
PROGRAMADORVB6 08/03/2012 20:05:16
#396724
Olá pessoal
Também li ao que respeita á PoolManager , mas parece-me que tenho que enveredar com o processo do LIGA / DESLIGA. sempre que entendo utilizar uma BD.
O exemplo em cima não está mau de todo, pois foi feito de modo a que o formulario , só ficasse [ô]preso[ô] a uma só instrução: Ligacao.
Em tempos quando trabalhava com VB6 eu utilizava esta função:
  [ô]---------------------------------------------------------------------------------------
No Formulário :
[ô]---------------------------------------------------------------------------------------

Private Sub Form_Unload(Cancel As Integer)
FecharDados
End Sub
[ô]---------------------------------------------------------------------------------------

No Módulo :

[ô]---------------------------------------------------------------------------------------
[ô]
[ô] Descrição : fecha todoas as bases de dados abertas
[ô]---------------------------------------------------------------------------------------
Public Function FecharDados() As Integer
On Error Resume Next

Dim wsCurr As Workspace
Dim dbCurr As Database
Dim Rs As Recordset
Dim Frm As Form

For Each wsCurr In Workspaces
For Each dbCurr In wsCurr.Databases
For Each Rs In dbCurr.Recordsets
Rs.Close
Set Rs = Nothing
Next

dbCurr.Close
Set dbCurr = Nothing
Next

wsCurr.Close
Set wsCurr = Nothing
Next

End Function

Por fim quero dar uma palavra de agradecimento a todos vos por me tentarem ajudar.
Atentamente.
programadorvb6
Tópico encerrado , respostas não são mais permitidas