SEGURANCA

USUARIO.EXCLUIDOS 09/09/2006 03:43:38
#170364
ai pessoal...beleza?!

tipo, queria ver com vcs, se seria possivel fazer o seguinte..

utilizo banco de dados access, e eu queria que ao sair do programa, posse feito um backup automatico do banco, em um diretorio bem secreto do windows, com uma extensao bem diferenciada... e que ai, ele excluisse o banco atual, para nao haver forma de acessar sem acesso ao login no programa... e ao entrar nesse progrma, ele descompactasse o banco de forma que podesse ter acesso se a senha do login fosse correta.

há alguma forma parecida que eu possa fazer??!
USUARIO.EXCLUIDOS 09/09/2006 07:18:57
#170366
MAICONJG

Se a aplicação roda monousuário, não há nenhum problema em fazer isso. Caso contrário, não é viável, pois várias pessoas estarão acessando / encerrando a aplicação em momentos distintos.

Mas supondo que a aplicação seja monousuário mesmo, para o backup, e entendendo que você REALMENTE queira ficar copiando o arquivo sempre (veja mais abaixo), você poderia fazer apenas uma compactação dos dados, do banco aliás, o que vai inclusive ajudar a manter o banco "enxuto" para a próxima utilização.

Depois de fazer a compactação, você pode copiar o arquivo banco para qualquer outra pasta, com outro nome/extensão, usando o FileCopy padrão do VB.

Esse "qualquer outra pasta", vamos entender que seja uma das pastas ditas "especiais" do Windows, como a Program Files, a Windows, a System32, a "Favoritos" etc. Pode, por exemplo, optar por copiar o arquivo com o nome "winntxp9.dll", na pasta System32.

Vamos supor que seu banco está na mesma pasta do aplicativo (App.Path) e que o nome do arquivo seja "banco.mdb". Ao encerrar sua aplicação, depois de desconectar-se do banco de dados, o que você faz é chamar uma função que compacte o banco e exclua o arquivo original.

Usando a MS-DAO:
================
'função para o backup compactado.
[c]Private Sub Compacta()
On Error GoTo hell:
Dim oJE As DAO.DBEngine
Dim oFS As Scripting.FileSystemObject
Dim sSourcePath As String
Dim sTargetPath As String
Set oFS = New Scripting.FileSystemObject
sSourcePath = App.Path & IIf(Right$(App.Path, 1) = "\", Empty, "\") & "banco.mdb"
sTargetPath = oFS.GetSpecialFolder(SystemFolder)
sTargetPath = sTargetPath & IIf(Right$(sTargetPath, 1) = "\", Empty, "\") & "winntxp9.dll"
Set oJE = New DAO.DBEngine
oJE.CompactDatabase sSourcePath, sTargetPath
If oFS.FileExists(sSourcepath) = True Then
oFS.DeleteFile sSourcePath, True
End If
GoTo sai:
hell:
MsgBox Err.Description
Err.Clear
sai:
sTargetPath = Empty
sSourcePath = Empty
Set oFS = Nothing
Set oJE = Nothing
End Sub

'Função para encerrar o aplicativo.
Private Sub EncerraApp()
Dim frm As VB.Form
For Each frm In Forms
Unload frm
Set frm = Nothing
Next
Compacta
End
End Sub

Usando a ADO/JRO:
=================

Com o Jet Replication, a diferença reside em dois pontos: Um, é que temos de passar ao metodo CompactDatabase as strings de conexão e não apenas o caminho/nome do banco. Dois, é que o destino da compactação deve ser necessariamente um arquivo do Jet Engine, ou seja, um "MDB". Mas, dá-se um jeito, como sempre.

'Função para banckup compactado do banco:
[c]Private Sub Compacta()
On Error GoTo hell:
Dim oJE As JRO.JetEngine
Dim oFS As Scripting.FileSystemObject
Dim sSourcePath As String
Dim sTargetPath As String
Set oFS = New Scripting.FileSystemObject
sSourcePath = App.Path & IIf(Right$(App.Path, 1) = "\", Empty, "\") & "banco.mdb"
sTargetPath = oFS.GetSpecialFolder(SystemFolder)
sTargetPath = sTargetPath & IIf(Right$(sTargetPath, 1) = "\", Empty, "\") & "winntxp9.mdb"
Set oJE = New JRO.JetEngine
oJE.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sSourcePath, _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sTargetPath
If oFS.FileExists(sSourcePath) = True Then
oFS.DeleteFile sSourcePath, True
End If
If oFS.FileExists(sTargetPath) = True Then
oFS.CopyFile sTargetPath, Replace$(sTargetPath, ".mdb", ".dll")
oFS.DeleteFile sTargetPath, True
End If
GoTo sai:
hell:
MsgBox Err.Description
Err.Clear
sai:
sTargetPath = Empty
sSourcePath = Empty
Set oFS = Nothing
Set oJE = Nothing
End Sub

'E novamente a função para encerramento da aplicação.
Private Sub EncerraApp()
Dim frm As VB.Form
For Each frm In Forms
Unload frm
Set frm = Nothing
Next
Compacta
End
End Sub

Inicialização do aplicativo:
============================
Ao iniciar o aplicativo, o caminho é o oposto, ou seja, você irá apenas copiar seu arquivo de dados de volta á pasta do aplicativo, ou seja, um FileCopy.


Agora, um detalhe que você DEVE considerar antes de adotar esse procedimento, é que o banco de dados não precisa ter a extensão "MDB" para ser conectado, nem precisa estar na pasta do aplicativo.

Assim, não é necessário, na verdade, implementar nada do que foi passado acima. Basta que você coloque o banco na pasta desejada, como o nome e a extensão desejada já na instalação e conecte a sua aplicação com esse Data Source.

No exemplo acima, onde teríamos algo como "C:\Windows\System32\winntxp9.dll", esse caminho é o que poderia ser usado na hora de conectar a aplicação ao banco, sem a necessidade de copiá-lo diariamente ao iniciar e ao encerrar.

Valew?
[/c]
USUARIO.EXCLUIDOS 09/09/2006 08:32:20
#170367
ai professor... tu é manero hein.. valew
mas explica uma coisa faz favor..

eu abro meu banco em todos os forms...exemplo:

Option Explicit
Dim BancoDeDados As Database
Dim TBFornecedores As Recordset

Private Sub Form_Load()
Set BancoDeDados = OpenDatabase(App.Path & "\sistema.mdb")
Set TBFornecedores = BancoDeDados.OpenRecordset("Fornecedores", dbOpenTable)
End Sub


o seu exemplo eu teria que aplicar tambem em todos os form no lugar desse??
USUARIO.EXCLUIDOS 09/09/2006 08:51:57
#170368
ai professor... eu apliquei no MDIPrincipal só que ao fechar ele deu erro na seguinte linha
Dim oFS As Scripting.FileSystemObject
ta dizendo que nao esra definido

me ajude ai.. valeww
USUARIO.EXCLUIDOS 09/09/2006 09:54:34
#170372
??
USUARIO.EXCLUIDOS 09/09/2006 12:37:05
#170390
Oi, discurpa a demora, sà', hehehe!

Respondendo, sim, todas as vezes em que você abre a conexão com o banco de dados, em cada um dos Form, você deverá substituir o caminho que lá está pelo caminho do banco já com o nome e extensão alterados.

O mais fácil é você iniciar a aplicação por uma Sub Main, criando uma variável pública para manter esse caminho. Assim, em todos os Form você usa essa variável e, se for preciso alterar, vai alterar apenas nessa Sub Main.

Por exemplo, no seu módulo:

Public sCaminhoDB As String

[c]Private Sub Main()
Dim oFS As Scripting.FileSystemObject
Set oFS = New Scripting.FileSystemObject
sCaminhoDB = oFS.GetSpecialFolder(SystemFolder)
sCaminhoDB = sCaminhoDB & IIf(Right$(sCaminhoDB, 1) = "\", Empty, "\") & "winntxp9.mdb"
Set oFS = Nothing
MDIForm.Show 1
End Sub


Aí, em seus Form, o que você vai fazer é:


Option Explicit 

Private BancoDeDados As DAO.Database
Private TBFornecedores As DAO.Recordset

[c]Private Sub Form_Load()
Set BancoDeDados = DBEngine.OpenDatabase(sCaminhoDB)
Set TBFornecedores = BancoDeDados.OpenRecordset("Fornecedores", dbOpenTable)
End Sub


Com relação ao problema que você encontrou com o meu exemplo, a falha foi minha. Veja, eu devia ter escrito que, para usar os objetos da biblioteca Scripting, você deve referenciá-la primeiro.

A Scripting é uma biblioteca da Microsoft, vem com os sistemas operacionais de 32bits, como o Windows 2000 e o XP, mas não é uma biblioteca nativa do VB6. Para referenciar essa biblioteca faça assim:

1 - Abra o seu projeto;
2 - No menu PROJECT, escolha a opção REFERENCES;
3 - No diálogo que aparece há um list com todas as bibliotecas COM/DCOM da sua máquina. Procure nesse list uma biblioteca chamada "Microsoft Scripting Runtime", que deve estar próxima ao final das bibliotecas da M$, e marque-a.
4 - Clique em Ok.

Está feita a referência.

Após essa referência, a linha Dim oFS As Scripting.FileSystemObject não vai mais apresentar mensagens de erro.

Qualquer dúvida continue postando aqui.

Todos aqui no fórum sempre podem ajudar com "n" maneiras diferentes, ou seja, não use apenas a minha visão da coisa. Espere a colaboração dos demais, pois normalmente aparecem idéias muito interessantes.

Valew?
[/c]
USUARIO.EXCLUIDOS 09/09/2006 13:04:58
#170394
ai professor...
la na trampo .. tinha dado só erro nessa linha que lhe passei,,

ja aqui em casa deu erro tambem na linha

Dim oJE As JRO.JetEngine

o que pode ser??
USUARIO.EXCLUIDOS 09/09/2006 13:10:32
#170395
ai professor..
eu referenciei Microsoft Jet And Replication Objects 2.6 library
ai saiu aquele erro...

mas agora ta dando.. na linha

sSourcePath = App.Path & IIf([txt-backcolor=#C0C0C0]Right$[/txt-backcolor](App.Path, 1) = "\", Empty, "\") & "sistema.mdb"

Compile error:
Type-declaration character does not match declared data type
me ajuda ai.. valeww
USUARIO.EXCLUIDOS 09/09/2006 15:51:55
#170424
??
USUARIO.EXCLUIDOS 09/09/2006 20:28:30
#170448
alguem pessoal??
USUARIO.EXCLUIDOS 09/09/2006 20:29:22
#170449
alguem pessoal??
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas