SEGURANCA
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??!
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??!
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 encerrar o aplicativo.
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.
'E novamente a função para encerramento da aplicação.
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]
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]
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
o seu exemplo eu teria que aplicar tambem em todos os form no lugar desse??
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??
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
Dim oFS As Scripting.FileSystemObject
ta dizendo que nao esra definido
me ajude ai.. valeww
??
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:
AÃ, em seus Form, o que você vai fazer é:
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]
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]
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??
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??
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
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
??
alguem pessoal??
alguem pessoal??
Tópico encerrado , respostas não são mais permitidas