Promotic

PmaAdo - Praktické příklady

Viz: objekt PmaAdo, PmaAdo - Podrobný popis objektu

Operace připojení k databázi je časově relativně náročná a časté připojování/odpojování k/od databáze může vést k tomu, že aplikace bude přetížená. Proto se doporučuje provést připojení k databázi po spuštění aplikace a odpojení od databáze při zastavování aplikace.

Zavření databáze je vhodné provést až po provedení všech potřebných operací s databází (nejčastěji až při ukončení aplikace).

Během práce s databázemi je nutno si vždy ověřit, zda prováděná operace proběhla úspěšně nebo zda skončila chybou.

Práci s databází pomocí PmaAdo v systému PROMOTIC lze rozdělit na dva základní způsoby:



Čtení dat do aplikace

Pořadí operací při načítání dat do aplikace objektem PmaAdo:
- připojení k databázi
- otevření příslušné tabulky
- zpracování dat v aplikaci
- zavření příslušné tabulky
- (volitelně: zavření databáze)


Jednotlivé operace jsou znázorněny v následujícím příkladu:
Příklad:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, vValues;

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

// otevření databáze, pokud není otevřená
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
// otevření příslušné tabulky
oRs = oAdo.RsOpen("", sSQL, "");
// Zjistí, zda otevření proběhlo úspěšně
if (Pm.IsValid(oRs))
{
// Zjistí, zda tabulka není prázdná
if (oRs.EOF && oRs.BOF)
{
// Pm.Debug "Tabulka (recordset) neobsahuje žádné záznamy"
return -1;
}
else
{
// pokud tabulka není prázdná, pak je ji možné načíst jako 2-rozměrné pole
vValues = oRs.GetRows();
return vValues;
}
}
else
{
// Pm.Debug "Chyba otevření tabulky"
return -1;
}
}
else
{
// Pm.Debug "Chyba otevření databáze"
return -1;
}


Zápis dat z aplikace do databáze

Zápis může být proveden jedním ze dvou způsobů:
1. Zápis dat do tabulky bez jejího předchozího otevření
2. Otevření tabulky a přidání nového řádku do této otevřené tabulky


Při zápisu/změně prvním způsobem je nutno provést následující kroky:
- připojení k databázi
- zapsání/změna dat v databázi
- (volitelně: zavření databáze)
Tento způsob zápisu využívá SQL příkazy INSERT nebo UPDATE.

Při zápisu/změně druhým způsobem je nutno provést následující kroky:
- připojení k databázi
- otevření tabulky a případně nalezení odpovídajícího záznamu
- zapsání/změna dat v databázi
- (volitelně: zavření databáze)
Tento způsob zápisu využívá metody objektů PmaAdo, AdoRecordset atd.

První způsob je šetrnější k aplikaci i k databázi, protože není nutno otevírat příslušnou tabulku a načítat jednotlivé řádky tabulky do paměti. Pro přidání nového řádku do tabulky pak stačí použít příkaz typu INSERT INTO (viz Použití příkazu insert into). Pro změnu stávajícího řádku lze použít příkaz typu UPDATE (viz Použití příkazu update). Tyto SQL příkazy musí být zapsány v syntaxi jazyka SQL dle použitého databázového systému. Tento způsob práce s databázemi tedy vyžaduje znalost jazyka SQL pro konkrétní databázi.

Druhý způsob nevyžaduje podrobnější znalost jazyka SQL, nicméně je náročnější (zejména paměťově) pro celou aplikaci i pro databázi, protože i pro přidání nového řádku je nutno otevřít (=načíst) tabulku (viz Použití metody "AddNew"). Při změně je nutno najít nejprve příslušný záznam a ten pak upravit (viz Editace aktuálního záznamu). Proto je tento způsob plně použitelný pouze při tabulkách s malým počtem záznamů. Lze také upravit SQL dotaz pro otevření tabulky tak, aby vrátil pouze omezenou část záznamů (ideálně pouze jeden záznam) - např. použitím složených SQL dotazů např. takto:
"select * from table1 where ctime = (select max(ctime) from table1)"
Pro tento účel se nedoporučuje používat omezovací klauzule typu select TOP, LIMIT atd.
Použití příkazu insert into:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, sTime;

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

// formát času pro databázi MS SQL
sTime = Pm.FormatDate(Pm.Time, 20);

// formát času pro databázi Oracle
sTime = Pm.FormatDate(Pm.Time, 21);

// formát času pro databázi 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')";

// otevření databáze, pokud není otevřená
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
// provedení SQL příkazu
oRs = oAdo.DbExecute("", sSQL, "");

// ověření, zda přidání skončilo úspěšně
if (oAdo.LastErr == 0)
{
// pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Nový záznam byl úspěšně zapsán do databáze");
return 1;
}
else
{
Pm.Debug("Chyba zapsání nového záznamu do databáze");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}


Použití příkazu update:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, sTime;

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

// formát času pro databázi MS SQL
sTime = Pm.FormatDate(Pm.Time, 20);

// formát času pro databázi Oracle
sTime = Pm.FormatDate(Pm.Time, 21);

// formát času pro databázi 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;

// otevření databáze, pokud není otevřená
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
// provedení SQL příkazu
oRs = oAdo.DbExecute("", sSQL, "");

// ověření, zda přidání skončilo úspěšně
if (oAdo.LastErr == 0)
{
// pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Stávající záznam byl úspěšně změněn v databázi");
return 1;
}
else
{
Pm.Debug("Chyba změny stávajícího záznamu v databázi");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}


Použití metody "AddNew":
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes;

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

// otevření databáze, pokud není otevřená
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
// otevření příslušné tabulky
oRs = oAdo.RsOpen("", sSQL, "lock:optimistic;");

// Zjistí, zda otevření proběhlo úspěšně
if (Pm.IsValid(oRs))
{
// pokud chceme přidat nový záznam, pak není nutno zjišťovat, zda tabulka není prázdná.
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)
{
// pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Nový záznam byl úspěšně zapsán do databáze");
return 1;
}
else
{
Pm.Debug("Chyba zapsání nového záznamu do databáze");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření tabulky");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}


Editace aktuálního záznamu:
JavaScriptVBScriptVyber a zkopíruj do schránky

var oAdo, oRs, sSQL, bRes, nTime;

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

// otevření databáze, pokud není otevřená
if (! oAdo.DbIsOpen())
{
bRes = oAdo.DbOpen();
}
else
{
bRes = true;
}

// pokud databáze je otevřená, pak lze pokračovat dál
if (bRes)
{
// otevření příslušné tabulky
oRs = oAdo.RsOpen("", sSQL, "lock:optimistic;");

// Zjistí, zda otevření proběhlo úspěšně
if (Pm.IsValid(oRs))
{
// Zjistí, zda tabulka není prázdná
if (oRs.EOF && oRs.BOF)
{
// Pm.Debug "Tabulka (recordset) neobsahuje žádné záznamy"
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)
{
// pokud výsledkem dotazu je množina záznamů, pak ji lze dále zpracovat
Pm.Debug("Stávající záznam byl úspěšně změněn v databázi");
return 1;
}
else
{
Pm.Debug("Chyba změny stávajícího záznamu v databázi");
return -1;
}
}
oRs.MoveNext();

} while (! oRs.EOF);
}
}
else
{
Pm.Debug("Chyba otevření tabulky");
return -1;
}
}
else
{
Pm.Debug("Chyba otevření databáze");
return -1;
}

Historie:
Pm8.03.21: Vytvořeno
© MICROSYS, spol. s r.o.