Promotic

PmaAdo - Praktyczne przykłady

Patrz: obiekt PmaAdo, PmaAdo - 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 jest konieczne zawsze sprawdzić, czy wykonywana operacja została wykonana poprawnie lub czy zakończyła się błędem.

Pracę z bazami danych przy pomocy PmaAdo w systemie PROMOTIC można podzielić na dwa podstawowe sposoby:



Odczyt danych do aplikacji

Kolejność operacji podczas odczytu danych do aplikacji przy pomocy obiektu PmaAdo:
- 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:
JavaScriptVBScriptWybierz oraz skopiuj do schowka

var oAdo, oRs, sSQL, bRes, vValues;

oAdo = pMe.Pm("../PmaAdo");
sSQL = "select * from table1";

// otwarcie bazy danych, jeżeli nie jest otewarta
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// jeżeli baza danych jest otwarta, wtedy można kontynuować
if (bRes)
{
// otwarcie odpowiedniej tabeli
oRs = oAdo.RsOpen("", sSQL, "");
// Stwierdzi, czy otwarcie przebiegło z powodzeniem
if (Pm.IsValid(oRs))
{
// Stwierdzi, czy tabela nie jest pusta
if (oRs.EOF && oRs.BOF)
{
// Pm.Debug "Tabela (recordset) nie zawiera żadnych rekordów"
return -1;
}
else
{
// jeżeli tabela nie jest pusta, wtedy można ją wczytać jako 2-wymiarową tablicę
vValues = oRs.GetRows();
return vValues;
}
}
else
{
// Pm.Debug "Błąd otwarcia tabeli"
return -1;
}
}
else
{
// Pm.Debug "Błąd otwarcia bazy danych"
return -1;
}


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 polecenia SQL INSERT lub UPDATE.

Podczas zapisu/zmiany drugim sposobem należy wykonać następujące kroki:
- podłączenie do bazy danych
- otwarcie tabeli oraz ewentualnie wyszukanie odpowiedniego rekordu
- zapis/zmiana danych w bazie danych
- (opcjonalnie: zamknięcie bazy danych)
Ten sposób zapisu wykorzystuje metody obiektów PmaAdo, AdoRecordset itd.

Pierwszy sposób jest oszczędniejszy do 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 zastosować polecenie typu UPDATE (patrz Zastosowanie polecenia update). Te polecenia SQL muszą być napisane w składni języka SQL dla zastosowanego systemu bazodanowego. Taki sposób pracy z bazami danych wymaga wiedzę na temat poleceń języka SQL dla konkretnej bazy danych.

Drugi spopsób nie wymaga szczegółowej wiedzy na temat poleceń języka SQL, nie mniej jednak jest badziej wymagający (zwłaszcza pamięciowo) dla całej aplikacji, ponieważ nawet w celu dodania nowego wiersza jest konieczne otworzyć (=wczytać) tabelę (patrz Zastosowanie metody "AddNew"). Podcczas zmiany jest konieczne najpierw wyszukać odpowiedni rekord a ten następnie zmienić (patrz Edycja 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, żeby 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:
JavaScriptVBScriptWybierz oraz skopiuj do schowka

var oAdo, oRs, sSQL, bRes, sTime;

oAdo = pMe.Pm("../PmaAdo");

// format czasu dla bazy danych MS SQL
sTime = Pm.FormatDate(Pm.Time, 20);

// format czasu dla bazy danych Oracle
sTime = Pm.FormatDate(Pm.Time, 21);

// format czasu dla bazy danych 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 (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// jeżeli baza danych jest otwarta, wtedy można kontynuować
if (bRes)
{
// wykonanie polecenia SQL
oRs = oAdo.DbExecute("", sSQL, "");

// sprawdzenie, czy dodanie zakończyło się powodzeniem
if (oAdo.LastErr == 0)
{
// 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");
return 1;
}
else
{
Pm.Debug("Błąd zapisania nowego rekordu do bazy danych");
return -1;
}
}
else
{
Pm.Debug("Błąd otwarcia bazy danych");
return -1;
}


Zastosowanie polecenia update:
JavaScriptVBScriptWybierz oraz skopiuj do schowka

var oAdo, oRs, sSQL, bRes, sTime;

oAdo = pMe.Pm("../PmaAdo");

// format czasu dla bazy danych MS SQL
sTime = Pm.FormatDate(Pm.Time, 20);

// format czasu dla bazy danych Oracle
sTime = Pm.FormatDate(Pm.Time, 21);

// format czasu dla bazy danych 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 (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// jeżeli baza danych jest otwarta, wtedy można kontynuować
if (bRes)
{
// wykonanie polecenia SQL
oRs = oAdo.DbExecute("", sSQL, "");

// sprawdzenie, czy dodanie zakończyło się powodzeniem
if (oAdo.LastErr == 0)
{
// 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");
return 1;
}
else
{
Pm.Debug("Błąd zmiany bieżąceko rekordu w bazie danych");
return -1;
}
}
else
{
Pm.Debug("Błąd otwarcia bazy danych");
return -1;
}


Zastosowanie metody "AddNew":
JavaScriptVBScriptWybierz oraz skopiuj do schowka

var oAdo, oRs, sSQL, bRes;

oAdo = pMe.Pm("../PmaAdo");
sSQL = "select * from table1";

// otwarcie bazy danych, jeżeli nie jest otewarta
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

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

// Stwierdzi, czy otwarcie przebiegło z powodzeniem
if (Pm.IsValid(oRs))
{
// 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)
{
// 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");
return 1;
}
else
{
Pm.Debug("Błąd zapisania nowego rekordu do bazy danych");
return -1;
}
}
else
{
Pm.Debug("Błąd otwarcia tabeli");
return -1;
}
}
else
{
Pm.Debug("Błąd otwarcia bazy danych");
return -1;
}


Edycja bieżącego rekordu:
JavaScriptVBScriptWybierz oraz skopiuj do schowka

var oAdo, oRs, sSQL, bRes, nTime;

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

// otwarcie bazy danych, jeżeli nie jest otewarta
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

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

// Stwierdzi, czy otwarcie przebiegło z powodzeniem
if (Pm.IsValid(oRs))
{
// Stwierdzi, czy tabela nie jest pusta
if (oRs.EOF && oRs.BOF)
{
// Pm.Debug "Tabela (recordset) nie zawiera żadnych rekordów"
return -1;
}
else
{
oRs.MoveFirst();
do
{
if (oRs.Fields.Item("ctime").Value ==nTime)
{
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 - PmaAdo/edit";
oRs.Update();

if (oRs.Pm_LastErr == 0)
{
// 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");
return 1;
}
else
{
Pm.Debug("Błąd zmiany bieżąceko rekordu w bazie danych");
return -1;
}
}
oRs.MoveNext();

} while (! oRs.EOF);
}
}
else
{
Pm.Debug("Błąd otwarcia tabeli");
return -1;
}
}
else
{
Pm.Debug("Błąd otwarcia bazy danych");
return -1;
}

Historia:
Pm8.03.21: Wytworzono
© MICROSYS, spol. s r.o.