Promotic
WikipediaLinkedInYoutubeTwitterFacebook

PmAdo - Praktyczne przykłady

Patrz: Obiekt PmAdo, PmAdo - Szczegółowy opis obiektu
 
Operacja podłączania do bazy danych jest stosunkowo czasochłonna a częste podłączanie/odłącznie do/od bazy danych może zpowodować przeciążenie aplikacji. Dlatego zalecanym jest wykonać podłączenie do bazy danych po uruchomieniu aplikacji a odłączenie od bazy danych podczas zatrzymywania aplikacji.
 
Zamknięcie bazy danych jest zalecane wykonać dopiero po wykonaniu wszystkich operacji ponad bazą (najczęściej dopiero podczas zatrzymania aplikacji).
 
W trakcie pracy z bazami danych należy zawsze sprawdzić, czy wykonywana operacja została wykonana poprawnie lub czy zakończyła się błędem.
 
Pracę z bazami danych przy pomocy PmAdo z punktu widzenia zastosowania w aplikacjach w systemie PROMOTIC można podzielić na dwa podstawowe sposoby:
 
 

Odczyt danych do aplikacji

Kolejność operacji podczas odczytu danych do aplikacji PROMOTIC przy pomocy obiektu PmAdo:
- podłączenia do bazy danych
- otwarcie odpowiedniej tabeli
- opracowanie danych w aplikacji
- zamknięcie odpowiedniej tabeli
- (opcjonalnie: zamknięcie bazy danych)
 
Pojedyńcze operacje są pokazane w następującym przykładzie:
Przykład:
VBScriptWybierz oraz skopiuj do schowka

Dim oAdo, oRs, sSQL, bRes, vValues

Set oAdo = pMe.Pm("../PmAdo")
sSQL = "select * from table1"

'otwarcie bazy danych, jeżeli nie jest otewarta
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'jeżeli baza danych jest otwarta, wtedy można kontynuować
If bRes Then
  'otwarcie odpowiedniej tabeli
  Set oRs = oAdo.RsOpen("", sSQL, "")
  'stwierdzenie, czy otwarcie przebiegło z powodzeniem
  If Pm.IsValid(oRs) Then
    'stwierdzenie, czy tabela nie jest pusta
    If oRs.EOF And oRs.BOF Then
      'Pm.Debug "Tabela (recordset) nie zawiera żadnych rekordów"
      pResult = -1
    Else
      'jeżeli tabelka nie jest pusta, można ją wczytać jako 2-wymiarową tablicę
      vValues = oRs.GetRows()
      pResult = vValues
    End If
  Else
    'Pm.Debug "Błąd otwarcia tabeli"
    pResult = -1
  End If
Else
  'Pm.Debug "Błąd otwarcia bazy danych"
  pResult = -1
End If
 

Zapis danych z aplikacji do bazy danych

Zapis może zostać wykonany jednym z dwu sposobów:
1. Zapis danych do tabeli bez jej wcześniejszego otwarcia
2. Otwarcie tabeli oraz dodanie nowego wiersza do tej otwartej tabeli
 
Podczas zapisu/zmiany pierwszym sposobem należy wykonać następujące kroki:
- podłączenie do bazy danych
- zapis/zmiana danych w bazie danych
- (opcjonalnie: zamknięcie bazy danych)
Ten sposób zapisu wykorzystuje polecenie SQL INSERT lub UPDATE.
 
Podczas zapisu/zmiany drugim sposobem należy wykonać następujące kroki:
- podłączenie bazy danych
- otwarcie tabeli oraz ewentualne wyszukanie odpowiedniego rekordu
- zapis/zmiana danych w bazie danych
- (opcjonalnie: zamknięcie bazy danych)
Ten sposób zapisu wykorzystuje metody obiektu PmAdo, AdoRecordset itd.
 
Pierwszy sposób jest oszczędniejszy dla aplikacji oraz bazy danych, ponieważ nie jest konieczne otwarcie odpowiedniej tabeli oraz wczytanie pojedyńczych wierszy tabeli do pamięci. W celu dodania wiersza do tabeli wystarczy tylko zastosowania polecenia typu INSERT INTRO (patrz Zastosowanie polecenia insert into). Do zmiany bieżącego wiersza można wykorzystać polecenie typu UPDATE (patrz Zastosowanie polecenia update). Te polecenia SQL muszą zostać napisane w składni języka SQL dla zastosowanego systemu bazodanowego. Taki sposób pracy z bazami danych wymaga wiedzę na temat poleceń w języku SQL dla konkretnej bazy danych.
 
Drugi spopsób nie wymaga szczegółowej wiedzy na temat poleceń w języku SQL, nie mniej jednak jest badziej wymagający (zwłaszcza pamięciowo) dla całej aplikacji, ponieważ nawet w celu dodania nowego wiersza należy otworzyć (=wczytać) tabelę (patrz Zastosowanie metody AddNew). Podcczas zmiany należy najpierw wyszukać odpowiedni rekord a ten następnie zmienić (patrz Edytacja bieżącego rekordu). Dlatego ten sposób można stosować tylko w przypadku pracy z tabelami o małej ilości rekordów. Można również ustawić SQL polecenie do otwarcia tabeli tak, by zwrócono tylko ograniczoną ilość rekordów (idealnie tylko jeden rekord) - np. zastosowaniem złożonych poleceń SQL np. w taki sposób:
"select * from table1 where ctime = (select max(ctime) from table1)"
W tym celu nie jest zalecane stosowanie klauzuli ograniczającej typu select TOP, LIMIT itd..
Zastosowanie polecenia insert into:
VBScriptWybierz oraz skopiuj do schowka

Dim oAdo, oRs, sSQL, bRes, sTime

Set oAdo = pMe.Pm("../PmAdo")

'format czasu dla MSSQL
sTime = Pm.FormatDate(Pm.Time, 20)

'format czasu dla Oracle
sTime = Pm.FormatDate(Pm.Time, 21)

'format czasu dla MySQL
sTime = Pm.FormatDate(Pm.Time, 22)

sSQL = "insert into table1(ctime, ctemperature, cpress, cstatus, cnote) values (" & sTime & ", 12.5, 1.5, 5, 'New record - INSERT')"

'otwarcie bazy danych, jeżeli nie jest otewarta
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'jeżeli baza danych jest otwarta, wtedy można kontynuować
If bRes Then
  'wykonanie polecenia SQL
  Set oRs = oAdo.DbExecute("", sSQL, "")

  'sprawdzenie, czy dodanie zakończyło się powodzeniem
  If oAdo.LastErr = 0 Then
    'jeżeli wynikiem polecenia jest zbiór rekordów, wtedy można go dalej opracować
    Pm.Debug "Nowy rekord został z powodzeniem zapisany do bazy danych"
    pResult = 1
  Else
    Pm.Debug "Błąd zapisania nowego wiersza do bazy danych"
    pResult = -1
  End If
Else
  Pm.Debug "Błąd otwarcia bazy danych"
  pResult = -1
End If
 
Zastosowanie polecenia update:
VBScriptWybierz oraz skopiuj do schowka

Dim oAdo, oRs, sSQL, bRes, sTime

Set oAdo = pMe.Pm("../PmAdo")

'format czasu dla MSSQL
sTime = Pm.FormatDate(Pm.Time, 20)

'format czasu dla Oracle
sTime = Pm.FormatDate(Pm.Time, 21)

'format czasu dla MySQL
sTime = Pm.FormatDate(Pm.Time, 22)

sSQL = "update table1 set ctemperature = 26.5, cPress = 1.83, cstatus = 8, cnote = 'change record UPDATE' where ctime = " & sTime

'otwarcie bazy danych, jeżeli nie jest otewarta
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'jeżeli baza danych jest otwarta, wtedy można kontynuować
If bRes Then
  'wykonanie polecenia SQL
  Set oRs = oAdo.DbExecute("", sSQL, "")

  'sprawdzenie, czy dodanie zakończyło się powodzeniem
  If oAdo.LastErr = 0 Then
    'jeżeli wynikiem polecenia jest zbiór rekordów, wtedy można go dalej opracować
    Pm.Debug "Bieżący rekord został z powodzeniem zmieniony w bazie danych"
    pResult = 1
  Else
    Pm.Debug "Błąd zmiany bieżąceko rekordu w bazie danych"
    pResult = -1
  End If
Else
  Pm.Debug "Błąd otwarcia bazy danych"
  pResult = -1
End If
 
Zastosowanie metody AddNew:
VBScriptWybierz oraz skopiuj do schowka

Dim oAdo, oRs, sSQL, bRes

Set oAdo = pMe.Pm("../PmAdo")
sSQL = "select * from table1"

'otwarcie bazy danych, jeżeli nie jest otewarta
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'jeżeli baza danych jest otwarta, wtedy można kontynuować
If bRes Then
  'otwarcie odpowiedniej tabeli
  Set oRs = oAdo.RsOpen("", sSQL, "lock:optimistic;")

  'stwierdzenie, czy otwarcie przebiegło z powodzeniem
  If Pm.IsValid(oRs) Then
    'jeżeli należy dodać nowy rekord, wtedy nie jest konieczne stwierdzanie, czy tabela nie jest pusta
    oRs.AddNew
    oRs.Fields.Item("ctime").Value = Pm.Time
    oRs.Fields.Item("ctemperature").Value = 12.5
    oRs.Fields.Item("cpress").Value = 1.5
    oRs.Fields.Item("cstatus").Value = 5
    oRs.Fields.Item("cnote").Value = "New record - AddNew"
    oRs.Update

    If oRs.Pm_LastErr=0 Then
      'jeżeli wynikiem polecenia jest zbiór rekordów, wtedy można go dalej opracować
      Pm.Debug "Nowy rekord został z powodzeniem zapisany do bazy danych"
      pResult = 1
    Else
      Pm.Debug "Błąd zapisania nowego wiersza do bazy danych"
      pResult = -1
    End If
  Else
    Pm.Debug "Błąd otwarcia tabeli"
    pResult = -1
  End If
Else
  Pm.Debug "Błąd otwarcia bazy danych"
  pResult = -1
End If
 
Edytacja bieżącego rekordu:
VBScriptWybierz oraz skopiuj do schowka

Dim oAdo, oRs, sSQL, bRes, nTime

Set oAdo = pMe.Pm("../PmAdo")
nTime = Pm.Time
sSQL = "select * from table1"

'otwarcie bazy danych, jeżeli nie jest otewarta
If Not oAdo.DbIsOpen() Then
  bRes = oAdo.DbOpen()
Else
  bRes = true
End If

'jeżeli baza danych jest otwarta, wtedy można kontynuować
If bRes Then
  'otwarcie odpowiedniej tabeli
  Set oRs = oAdo.RsOpen("", sSQL, "lock:optimistic;")

  'stwierdzenie, czy otwarcie przebiegło z powodzeniem
  If Pm.IsValid(oRs) Then
    'stwierdzenie, czy tabela nie jest pusta
    If oRs.EOF And oRs.BOF Then
      'Pm.Debug "Tabela (recordset) nie zawiera żadnych rekordów"
      pResult = -1
    Else
      oRs.MoveFirst
      Do
        If oRs.Fields.Item("ctime").Value=nTime Then
          oRs.Fields.Item("ctemperature").Value = 26.5
          oRs.Fields.Item("cpress").Value = 1.83
          oRs.Fields.Item("cstatus").Value = 8
          oRs.Fields.Item("cnote").Value = "Change record - PmAdo/edit"
          oRs.Update

          If oRs.Pm_LastErr=0 Then
            'jeżeli wynikiem polecenia jest zbiór rekordów, wtedy można go dalej opracować
            Pm.Debug "Bieżący rekord został z powodzeniem zmieniony w bazie danych"
            pResult = 1
          Else
            Pm.Debug "Błąd zmiany bieżąceko rekordu w bazie danych"
            pResult = -1
          End If
        End If
        oRs.MoveNext
Loop While
       Not oRs.EOF
    End If
  Else
    Pm.Debug "Błąd otwarcia tabeli"
    pResult = -1
  End If
Else
  Pm.Debug "Błąd otwarcia bazy danych"
  pResult = -1
End If
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice