Nyt pitäisi tehdä koodia VB6:lla joka selvittää onko Access kanta varattuna, eli auki jollain verkon työasemista, jos ei ole "error handleria" niin ohjelma kaatuu jos tapahtuu yhteentörmäys kannassa.
E
Moi erkki!
Tutkit Dir komennolla onko koneella/hakemistossa, jolla kanta fyysisesti sijaitsee olemassa saman niminen .ldb -päätteinen (locked database - Access 2003 alas sekä ylöspäin) tai .laccdb - päätteinen (locked access database - Access 2007 ja ylöspäin) tiedosto kuin, itse tietokanta. Jos moinen löytyy niin pitää virheen ohituksen + Kill käskyn avulla, muutaman kerran ajastetusti pyörähtävässä loopissa, yritettävä poistaa/tsekata löytyykö em. tiedosto edelleen. Tämä johtuu sellaisesta ilmiöstä, että ko. tiedosto jää melko tasaisesti, varsinkin virhetilanteissa, kummittelemaan vaikka kanta suljettaisiinkin.
Elikäs jotain tällaista:
Private Command1_Click() Dim vipu As integer Dim polku1 As string Dim polku2 As String polku = Lcase(Text1.Text) If Len(polku) > 4 And InStr(polku, ".mdb") > 0 Then If Right(polku, 4) = ".mdb" Then vipu = 1 ElseIf Len(polku) > 6 And InStr(polku, ".accdb") > 0 Then If Right(polku, 6) = ".accdb" Then vipu = 2 End if Select case vipu Case 1 polku2 = Replace(polku1, ".mdb", ".ldb") Case 2 polku2 = Replace(polku1, ".accdb", ".laccdb") Case else Exit Sub End Select Static laskuri As Integer takaisin: DoEvents If Dir(polku2) = "" Then 'avaa tietokanta (polku1)... laskuri = 0: Exit Sub Else On Error Resume Next Kill polku If Err <> 0 Then Err.Clear On Error Goto 0 If laskuri < 10 Then laskuri = lakuri + 1 Else MsgBox "Tietokanta varattu, yritä myöhemmin uudelleen" laskuri = 0: Exit Sub End If ajastin 0.5 'puoli sekuntia GoTo takaisin Else GoTo takaisin End If End If End Sub Sub ajastin (viive As single) viive = viive + Timer Do While viive > Timer: DoEvents: Loop End Sub
nea
Ok, silloin kun kanta on avattu itse Access ohjelmalla syntyy tuo .ldb, mutta kun kanta on avattu omalla VB koodilla käyttäen DAO 3.6 niin ei synny tätä .ldb-fileä. Tosin voin luoda vastaavanlaisen tilapäis filen kun kanta avataan ja poistaa sen kun kanta suljetaan. Onkohan tämä nyt SQL vai joku muu mutta tällä avaan kannan:
Set asdb = OpenDatabase(datakanta, True, False, "")
Set astaulu = asdb.OpenRecordset("nimet", dbOpenDynaset
Kiitos koodista, kokeilen sitä.
Moi taas erkki!
Jos käyttää DAO DNS-yhteyttä (dbUseODBC) niin edellä mainitsemani lock-tiedosto(t) luodaan yhteyttä avattaessa ja poistetaan, kun yhteys suljetaan.
Esim. Windows XP:ssä ODBC yhteystietolähde luodaan seuraavasti:
Käynnistä -> Ohjaupaneeli -> Vaihda perinteiseen näkymään -> Valvontatyökalut -> Tietolähteet (ODBC) -> Järjestelmätietolähde (DNS) -> Lisää -> Microsoft Access Driver (*.mdb, *.accdb) -> Valmis -> Data Source Name -tekstiruuttuun esim. DaoTest ja Description -tekstiruutuun esim. DaoTest Connection -> Select -> etsitään haluttu tietokanta (esim. X:\tietokannat\tietokanta.accdb) ja klikataan OK -> OK.
Dim wrkODBC As DAO.Workspace Dim db As DAO.Database Dim rs As DAO.Recordset Private Sub Command1_Click() Dim vipu As integer Dim polku1 As string Dim polku2 As String polku1 = "X:\tietokannat\tietokanta.accdb" 'esim. Label1.Caption = "Tietokantayhteys: luodaan yhteyttä" If Dir(polku1) = "" Then MsgBox "Tiedostoa " & poku1 & " ei löydy!" Label1.Caption = "Tietokantayhteys: ei yhteyttä" Exit Sub End If If InStr(polku1, ".mdb") > 0 Then If Right(polku1, 4) = ".mdb" Then vipu = 1 ElseIf InStr(polku1, ".accdb") > 0 Then If Right(polku1, 6) = ".accdb" Then vipu = 2 End if Select case vipu Case 1 polku2 = Replace(polku1, ".mdb", ".ldb") Case 2 polku2 = Replace(polku1, ".accdb", ".laccdb") Case else Exit Sub End Select Static laskuri As Integer takaisin: DoEvents If Dir(polku2) = "" Then AvaaTietokanta laskuri = 0: Exit Sub Else On Error Resume Next Kill polku2 If Err <> 0 Then Err.Clear On Error Goto 0 If laskuri < 10 Then laskuri = laskuri + 1 Else Label1.Caption = "Tietokantayhteys: ei yhteyttä" MsgBox "Tietokanta varattu, yritä myöhemmin uudelleen" laskuri = 0: Exit Sub End If Label1.Caption = _ "Tietokantayhteys: ei yhteyttä, yritetään uudestaan..." ajastin 0.5 'puoli sekuntia GoTo takaisin Else GoTo takaisin End If End If End Sub Sub AvaaTietokanta() Set wrkODBC = CreateWorkspace("", "", "", dbUseODBC) If wrkODBC Is Nothing Then MsgBox "Workspace objektin luonti epäonnistui!" Exit Sub End If Set db = wrkODBC.OpenDatabase("DaoTest", _ dbDriverNoPrompt, False, _ "ODBC;DATABASE=;UID=Admin;PWD=;DSN=DaoTest") Set rs = db.OpenRecordset("TAULU1", _ dbOpenDynaset, dbRunAsync, dbOptimisticValue) 'esim. Label1.Caption = "Yhteys tietokantaan " Label1.Caption = "Tietokantayhteys: " & db.Name 'Testi MsgBox rs.Fields(0).Value rs.Close: Set rs = Nothing db.Close: Set db = Nothing wrkODBC.Close: Set wrkODBC = Nothing Label1.Caption = "Tietokantayhteys: yhteys katkaistu" End Sub Sub ajastin (viive As single) viive = viive + Timer Do While viive > Timer: DoEvents: Loop End Sub
(oikea nimi)
Aihe on jo aika vanha, joten et voi enää vastata siihen.