Crearea unei baze de date de acces de rezervă comprimat - software-ul

Aceasta încheie problemele juridice;) și continuă să studieze codul.

Voi începe o mică distanță.

Faptul că dezvoltatorii cu experiență întotdeauna să păstreze datele într-un singur fișier (MDB), precum și cererea în celălalt (MDE). Nu vom menționa ADP și SQL (I deosebit de inteligent;). Deci, ușor de a organiza activitatea în rețea - suficient pentru a împrăștia fișier o aplicație de pe fiecare computer în rețea și, dacă este necesar, modificați referința fișier la tabele, situată undeva pe un server. Reduce sarcina pe rețea, deoarece toate formele, rapoartele sunt deja pe computerul client în rețeaua de date numai transmise, este ușor să actualizeze aplicația - suficient pentru a înlocui aplicațiile pe noua versiune. Eu sunt nici o excepție și I) - toate proiectele sprijinite în acest mod.

În aplicațiile mele este principala (inițial) forma frmMainMenu, care se deschide întregul ecran, emulează frumoase meniuri personalizate pentru acțiunea ulterioară. Această formă nu are nimic de-a face cu tabele (fără înregistrări sursă, nu trebuie confundate cu standardul forma tastatura de acces!) Și, prin urmare, nu are legătură cu fișierele bazei de date (tabele), adică atunci când deschideți fișierul formularul de bază de date nu este ocupat și disponibil pentru procesarea de către arhivator. Rezultă din această concluzie că datele arhivate fișier numai în cazul în care nu are acces la orice rețea sau local - nimeni altcineva nu a deschis fișierul. Desigur, aceasta impune restricții asupra arhivei, dar este singura cale corectă - total inacceptabilă pentru datele de arhivă în timpul funcționării poate, este indexare, actualizarea, ștergerea, astfel încât nu știi niciodată ce se poate întâmpla în baza de date. Prin urmare, trebuie să am pus avertisment sever înainte de a începe copierea de rezervă, și, eventual, verificați accesibilitatea fișier. A doua condiție - arhivare are loc pe computerul pe care datele în sine și sunt, cu toate că acest lucru nu este critică (este posibil să se calculeze locația fișierului cu datele din orice aplicație la distanță pe căi de tabele, dar eu nu fac asta). Pentru a preveni pierderea de date din cauza unor defecțiuni de hard disk, trebuie să resetați periodic copiile de rezervă pe CD / DVD-RW, sau la alte calculatoare (discutabil). Dar este deja alte probleme administrative.

Aici este un lung, dar simt nevoia de a se alătura.

Pornind de frmMainMenu se deschide pe computerele utilizatorilor imediat (există mai multe date accesează, situată pe un alt computer), acoperă întregul ecran monitorului (indiferent de rezoluția ecranului), și creează un mediu de lucru datorită potrivire gamă experimental tonală;), unele informații despre programul , logo-ul de designer și meniuri interactive. Vom continua să ia în considerare codul:

Opțiunea Compara Baza de date
Opțiunea explicit

„API pentru a determina - dacă există un fișier
Private PathFileExists Declare Function Lib "Shlwapi.dll" _
Alias ​​"PathFileExistsA" (ByVal pszPath Ca String) atâta timp
„Dacă doriți să evitați utilizarea API-ul, este mai ușor de utilizat

„Dir () operator - mai târziu în acest articol oferă exemple de

Sub LaunchArhiving Privat

Opțiunea Compara Baza de date
Opțiunea explicit

„Pentru a determina finalizarea programului
Declare Private Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess atâta timp, ByVal bInheritHandle atâta timp, ByVal dwProcessId Atâta timp) atâta timp
Declare Private Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess Ca Long lpExitCode Ca Long) Ca pe termen lung
Declare Private Function CloseHandle Lib "kernel32" (ByVal hObject Ca Long) Ca pe termen lung

Const STILL_ACTIVE = 259
Const PROCESS_QUERY_INFORMATION = 1024

Private idProg Ca mâner lung“, mențineți contactul de funcționare prog
bIsStarted Private Ca boolean

Private Sub Form_Open (Anulare ca integer)
Dim strAppPath ca șir
„Cadrul calea de salvare
strAppPath = Application.CurrentProject.Path „“

„Aici este necesar să se verifice fișierul WinRar.exe disponibilitatea în dosarul. \ addons

„Mesajul pe care nu pot fi găsite în dosarul WinRar.exe arhiva. \ addons și de ieșire

„Pe lângă existența unui dosar. \ Arhives

„Mesaj, care nu găsește dosarul \ Arhives pentru stocarea fișierelor și de ieșire
idProg = Shell (strAppPath "Addons \ WinRAR un -r -m5 -ag_DD-MM-YYYY_HH-MM" _

strAppPath "Arhives \ MyDataBase_Data" strAppPath _

"MyDataBase_Data.mdb", vbHide)
bIsStarted = Adevărat
end Sub

Private Sub Form_Timer ()
IsRunning Dim Ca boolean
Dim hProc Ca lung, IRET Ca pe termen lung

Dacă bIsStarted Atunci
„A început și de așteptare, domnule, atunci când va programul extern
hProc = OpenProcess (PROCESS_QUERY_INFORMATION, False, idProg)
Dacă hProc <> vbNull Apoi GetExitCodeProcess hProc, IRET
IsRunning = (IRET = STILL_ACTIVE)
CloseHandle hProc

Dacă nu IsRunning Apoi „procesul nu este mai - peste tot

DoCmd.Close
End If
End If
end Sub

Track două evenimente forma: Deschideți și cronometrul (trebuie să fie setat la 1000). Realizăm lansarea sub-directorul \ addons WinRar fișierul executabil cu opțiuni de linie de comandă. Notă -ag_DD-MM-YYYY_HH-MM-cheie, care este, de fiecare dată când vom rula arhiva, arhiva va fi creat cu noua dată adăugat la numele fișierului. Din moment ce arhivele și se vor acumula în subdirectorul \ Arhives. Foarte convenabil la sufixul extensie pentru a stabili data și ora de rezervă, și ușor de sortare.

Evenimentul face timer, are loc în fiecare secundă (1000), un contact piesă mâner care rulează în evenimentul Form_Open proces. După procesul de verificare (încă activ?), În cazul în care procesul nu mai este activ, aceasta înseamnă, procesul de WinRAR.exe lansat de noi terminat, iar noi închidem forma unui avertisment, dacă este încă activ, atunci vom aștepta până la următorul eveniment de timer.

Așa cum am spus mai sus, puteți utiliza cu ușurință orice Archiver care acceptă linia de comandă, este de dorit ca acesta se adaugă la numele fișierului are data și ora ca RAR. Deși, se poate crea cu ușurință un nume de fișier folosind codul VBA, și „alunecare“ compus ImyaArhiva Format (data, "_ zz-ll-YYYY_") Format (timp, "_ HH-MM") orice arhivator (de exemplu, 7-Zip de mai jos). Dacă îndrăznești;) utilizați WinRar, apoi se pune doar în folderul \ addons fișier WinRar.exe. Nimic altceva pentru că nu este necesar.

Din moment ce vorbim despre copie de siguranță, împărtășiți sfaturi încă tineri programatori: aplicații de arhivare «acumulative» in timpul dezvoltarii cu setări speciale WinRar. Am un obicei bun;) după mai multe modificări în program, faceți clic pe butonul din dreapta al mouse-ului pe aplicația în fișierul Explorer (prefer TC) și selectați din meniul contextual comanda WinRar -> Adăugați la arhiva „ImyaFayla.rar“. Trucul este că parametrii RAR istoricului: „Settings“ -> „Profil prestabilit“ -> „Backup“, am înființat un „adăugat la numele arhivei _dd-mm-yyyy_hh mm care se încheie pe o mască“, iar acum, alegând această comandă, pentru a primi întotdeauna un nou fișier arhivă cu adăugarea de data curentă și ora creării. Mai mult de o dată a trebuit să mă întorc, și datorită acestei metode, am alege întotdeauna fără greș drept „punctul de revenire.“ Eu fac copii de rezervă în timpul funcționării foarte multe ori, chiar și atunci când am aduce schimbări minore ale programului, a devenit destul de împovărătoare;)

buton pentru a efectua backup, desigur, este bun, dar. Faptul că utilizatorii sunt în mod constant uitând să-l apăsați. După cum se arată, pur și simplu uita, nu în mod specific;). Așa că am adăugat procedura de ieșire din baza de date ca un memento de rezervă. Foarte util atunci când utilizatorul închide programul - a oferit pentru a face o copie de rezervă. Aici nu uita;)

La început am încercat să emită un mesaj de avertisment - așteptați un minut. bla, bla, bla. Ce un moment când poți - totul a fost foarte imprevizibil - să se uite la indicatorul de activitate pe disc. Da. A trebuit să se gândească la o implementare mai corectă și, ca întotdeauna, o soluție simplă a fost găsit;)

Așa cum am scris mai întâi. Și ce probleme apar, știi deja.

și punerea în aplicare „corectă“ va fi aici astfel:

Se merge mai departe. Așa cum am scris mai sus și datele aplicației am stocate separat, baza este pe server, există, de asemenea, locul de muncă, iar aplicațiile client împrăștiate pe computerele utilizatorilor. Aplicația client este una și nu există nici o diferență, dacă acesta se execută pe server sau pe masina client. I a păstra la ceea ce este necesar pentru a verifica - dacă fișierul MyDataBase_Data.mdb se află în același folder ca și aplicația. Dacă este, atunci este un server, și puteți face copii de siguranță. Toate acestea au fost deja discutate mai sus, am reîmprospăta memoria;). De asemenea, este necesar să se verifice pentru MyDataBase_Data.ldb de blocare-fișier. Dacă acest fișier există - atunci baza este deschisă la orice mașină, indiferent de cât, este încă imposibil de a face copii de siguranță (și nu). De aceea, nici măcar bâlbâi despre copierea de rezervă și se lasă în tăcere). În cazul în care condițiile de creare a unei copii de rezervă este favorabil, atunci cerem memento întrebare. Cred că este nevoie de această întrebare, și dintr-o dată focul, și o nevoie urgentă de a opri calculatorul;). Gluma, desigur.

Asta e tot butonul de ieșire cod:

„La ieșire (presare Randament)
„Verificați disponibilitatea fișierului MyDataBase_Data.mdb dacă există ceva
„Verificați disponibilitatea fișierului MyDataBase_Data.ldb în cazul în care nu este
„Oferta de a face arhiva de ieșire, în cazul în care este de acord, arhivare și de ieșire.
Dacă PathFileExists (strAppPath „MyDataBase_Data.mdb“) = 1 Apoi, „înseamnă că există fișierul
Dacă PathFileExists (strAppPath "MyDataBase_Data.ldb") <> 1 Atunci

Aplicație practică: în general, ideea este buna sa academică descrisă mai sus;). Dar, după ce a testat codul de mai sus de practică, am ajuns la concluzia că este necesar să se simplifice codul, și puternic! ;)

Reflectând privind simplificarea codului, am ajuns la un astfel de rezultat.

În forma eveniment de pornire (cel pe care am mereu deschis pe ecran ca bekgraund) Form_Unload adăugați următorul cod:

Private Sub Form_Unload (Anulare ca integer)
Dim strAppPath ca șir
Dim idProg Atâta timp
Dim DirectoryFound Ca String „pentru a verifica existența unui dosar

„Cadrul calea de salvare
strAppPath = Application.CurrentProject.Path „“
„La ieșirea din program -
„Controale pentru încălcări fișier PDD_data.mdb, în ​​caz afirmativ,
„Controale pentru încălcări fișier PDD_data.ldb, dacă nu,
„Oferta de a face arhiva de ieșire, în cazul în care este de acord, arhivare și de ieșire.
Dacă Dir (strAppPath "Narusheniya_PDD_data.mdb") <> „“ Atunci

„Mijloacele de fișier Narusheniya_PDD_data.mdb există - este serverul!
Dacă Dir (strAppPath "Narusheniya_PDD_data.ldb") = "" Atunci

„Înseamnă un fișier de blocare nu există - nimeni nu deține un fișier
Dacă MsgBox ( „Nu uitați să creați o copie de rezervă a bazei de date de la finalizarea lucrărilor.“ vbCrLf vbCrLf _
„Creați copia de rezervă a bazei de date chiar acum?“, VbInformation + vbYesNo, _
„Arhivarea datelor după finalizare“) = vbYes Apoi
„Verificați dacă fișierul WinRar.exe se află în folderul \ addons
Dacă Dir (strAppPath "Addons \ WinRAR.exe") = "" Atunci
MsgBox „Nu a fost găsit în arhiva WinRar.exe subdirectorul \ addons!“, VbCritical, „Nu se poate porni backup bază de date“
Exit Sub
End If
„Verificați dosarul \ Arhivele
DirectoryFound = Dir (strAppPath "Arhives", vbDirectory)
Dacă (Len (DirectoryFound) = 0 sau Err = 76) Apoi „errPathNotFound = 76
MsgBox „Nu răsfoiți la folderul \ Arhives pentru plasare de fișier“, vbCritical, „Not Found dosar pentru fișiere“
Exit Sub
End If
idProg = Shell (strAppPath "Addons \ WinRAR un -r -m5 -ag_DD-MM-YYYY_HH-MM" strAppPath "Arhives \ Narusheniya_PDD_data" strAppPath "Narusheniya_PDD_data.mdb", vbNormalFocus)
End If
End If
End If
end Sub

Acest cod ne oferă avantaje solide:

În primul rând: vizualizarea procesului de arhivare, care poate fi și de a încetini și de a anula (baza în sine și cererea este închisă, doar fereastra Archiver rămâne pe ecran) - utilizatorul nu foia într-un scaun de la o pierdere atunci când la sfârșitul tot acest proces ciudat;) În al doilea rând : în dosarul în care WinRAR.exe, a pus, de asemenea, WinRAR.hlp fișierul de ajutor - utilizatorul poate citi o mare descriere a procesului de arhivare în timpul procesului de backup, făcând clic pe [Help] (și vă sfătuiesc să verificați;), în al treilea: cod mult mai simplu și să acorde o atenție - întregul proces a suferit n în evenimentul Unload (start) formulare - adică indiferent de modul în care utilizatorul închide aplicația - o cruce în colțul din dreapta sus al formei sau a intenționat eliberarea butonului de eliberare (dar numai în condiții favorabile pentru arhivare!) tot nu se poate evita;).

Și totuși, WinRar - Arhivator perfectă, poate cel mai bun, dar nu este liber, așa că totul va fi bine;) dacă utilizați o versiune achiziționat în mod legal.

În acest exemplu, eu sunt, folosind compresie în Zip standard (ceea ce cred că este justificată, având în vedere sprijinul standardului în cele mai multe Windows XP) metoda normală de compresie - foarte rapid și destul de puternic - 48 MB la 6,2 MB comprimat. (Apropo, WinRar exemplul de mai sus face 48 MB 4.3 MB, dar există modul de compresie setat la maxim). În cazul în care modul de compresie la maxim, și 7-Zip, atunci fișierul este redus la 6 Mb, dar crește în mod semnificativ timpul de backup - la urma urmei, am decis să rămână pe metoda normală de compresie Zip.

Există două moduri de a folosi arhivator 7-Zip:

prima metodă. Dacă ați instalat deja arhiva, apoi copiați doar fișierul din folderul Arhivator 7zg.exe (implicit „C: \ Program Files \ 7-Zip \ ..“) în \ baza de date dosar AddOns. Ei bine, în configurația Archiver, aveți posibilitatea să comutați pe limba română, dacă doriți.

a doua metodă. Dacă nu doriți să instalați arhivator sau planul de a transfera baza de date o altă mașină, un pic mai mult „complicat“ - arhivator 7-Zip este necesară pentru a comprima toate cele trei dosare, strict aranjate într-o structură ierarhică. Puteți lăsa o structură minimă pentru a crea arhive cu 7-Zip - personal am făcut acest lucru:

dosarul AddOns în fișierul este copiat 7zg.exe

în dosarul AddOns, a crea un subfolder Codecuri și copiat fișierul acolo Deflate.dll

în dosarul AddOns, a crea un Formate de subfoldere și copiat fișierul acolo zip.dll

acest lucru este minimul pe care este necesar arhivator de compresie 7-Zip în Zip (nici o înregistrare suplimentară a componentelor nu este necesar să se efectueze).

După o astfel de manipulare poate începe să învețe codul - consideră că minim 7-Zip deja „instalat“ pe mașină.

Ca bază vom lua cele mai recente cod, care este folosit ca un arhivator WinRar și „ascuta“ conform 7-Zip:

Private Sub Form_Unload (Anulare ca integer)
Dim strAppPath ca șir
Dim idProg Atâta timp
Dim DirectoryFound Ca String „pentru a verifica existența unui dosar

„Cadrul calea de salvare
strAppPath = Application.CurrentProject.Path „“
„La ieșirea din program -
„Controale pentru încălcări fișier PDD_data.mdb, în ​​caz afirmativ,
„Controale pentru încălcări fișier PDD_data.ldb, dacă nu,
„Oferta de a face arhiva de ieșire, în cazul în care este de acord, arhivare și de ieșire.
Dacă Dir (strAppPath "Narusheniya_PDD_data.mdb") <> „“ Atunci

„Mijloacele de fișier Narusheniya_PDD_data.mdb există - este serverul!
Dacă Dir (strAppPath "Narusheniya_PDD_data.ldb") = "" Atunci

„Înseamnă un fișier de blocare nu există - nimeni nu deține un fișier
Dacă MsgBox ( „Nu uitați să creați o copie de rezervă a bazei de date de la finalizarea lucrărilor.“ vbCrLf vbCrLf _
„Creați copia de rezervă a bazei de date chiar acum?“, VbInformation + vbYesNo, _
„Arhivarea datelor după finalizare“) = vbYes Apoi
„Verificați dacă 7zg.exe fișier se află în folderul \ addons
Dacă Dir (strAppPath "Addons \ 7zg.exe") = "" Atunci
MsgBox „Nu a fost găsit în arhiva 7zg.exe subdirectorul \ addons!“, VbCritical, „Nu se poate porni backup bază de date“
Exit Sub
End If
„Verificați dosarul \ Arhivele
DirectoryFound = Dir (strAppPath "Arhives", vbDirectory)
Dacă (Len (DirectoryFound) = 0 sau Err = 76) Apoi „errPathNotFound = 76
MsgBox „Nu răsfoiți la folderul \ Arhives pentru plasare de fișier“, vbCritical, „Not Found dosar pentru fișiere“
Exit Sub
End If

„Lansarea Archiver
idProg = Shell (strAppPath "Addons \ 7zg.exe un -tzip" strAppPath "Arhives \ Narusheniya_PDD_data" Format (data, "_ zz-ll-YYYY_") Format (timp, "_ HH-MM") ".zip" strAppPath "Narusheniya_PDD_data.mdb", vbNormalFocus)
End If
End If
End If
end Sub

Asta e tot. Acum puteți cu o conștiință curată funcționează pe baza arhivei 7-Zip, tu și nimeni nu va spune un cuvânt rău;)