Database query-objektet
Database query-objektet är ett objekt som returneras när man anropar AsyncQuery på ett databasobjekt. Database query-objektet innehåller information om databasfrågan och kommer såsmåningom att innehålla resultatet av frågan.
Database query-objektet måste finnas så länge databasfrågan körs och måste alltså sparas undan i en variabel lokalt i skriptet.
Metoder i Database query-objektet
Fetch() - Används för att hämta nästa rad från resultatet. Om det finns fler rader returnerar Fetch() true annars false. Om det fanns fler rader att hämta kommer CurrentRow att innehålla data för nästa rad. Se exempel under CurrentRow nedan.
Egenskaper i Database query-objektet
TransactionID - Detta är ett löpnummer som räknas upp för varje asynkron fråga som ställs, oavsett vilket databasobjekt de ställs på. TransactionID kan användas för att koppla ihop frågans id med rätt event på databasobjektet.
Exempel:
if (get_data)
{
get_data = false;
var res = DB.AsyncQuery("select * from myTable;");
Debug.Print("Query started: " + res.TransactionID);
}
DB.onQueryFinished = function(event)
{
Debug.Print("Query finished: " + event.target.TransactionID);
for(var c in event.target.Columns)
{
Debug.Print(event.target.Columns[c] + " = " + event.target.Rows[event.target.RowCount-1][c]);
}
}
I ovanstående exempel skrivs transaktions id ut både när AsyncQuery anropas och i onQueryFinished.
ColumnCount - Antalet kolumner i resultatet av databasfrågan. Om frågan inte returnerar några kolumner är värdet 0.
Columns - En lista på de kolumnamn som returneras. Det högsta index som finns i listan är ColumnCount - 1 om ColumnCount är större än 0. Annars är listan tom.
För att skriva ut namnen på de kolumner som returneras i frågan kan du göra så här:
DB.onQueryFinished = function(event)
{
for(var c in event.target.Columns)
{
Debug.Print(event.target.Columns[c]);
}
}
CurrentRow - Innehåller en lista med värden för aktuell rad. Först efter att metoden Fetch() har anropats och returnerar true innehåller CurrentRow några värden. För att iterrera igenom alla rader som returneras av en fråga och skriva ut värdena kan du göra så här:
DB.onQueryFinished = function(event)
{
Debug.Print("Query finished: " + event.target.TransactionID);
while(event.target.Fetch())
{
for(var c in event.target.CurrentRow)
{
Debug.Print(event.target.Columns[c] + " = " + event.target.CurrentRow[c]);
}
}
}
Tänk på att detta bara är ett exempel. I verkligheten skriver man inte ut värdena, utan använder dem på något sätt i stället. Försök också skriva dina SQL-satser på ett sådant sätt att så få rader som möjligt returneras. Detta för att optimera prestanda i ditt system.
Error - Är ett objekt i sig med två egenskaper som innehåller en felkod och beskrivning av eventuellt fel på SQL-frågan.
Error.Code - Är felkoden som returneras. Är det inget fel är värdet 0.
Error.Message - Är en sträng innehållande felmeddelandet. Är det inget fel är strängen tom.
RowCount - Antalet rader som returneras av frågan. Returneras inga rader är värdet 0.
Status - Är status på frågan. Se nedan för konstanter i databas query-objektet. Det finns 3 värden Status kan anta. Endast om Status är STATUS_FINISHED är resultatet tillgängligt i övriga egenskaper.
Events i Database query-objektet
Det finns ett event du kan lyssna på i database query-objektet.
onQueryFinished(event)
Varje database query-objekt kan generera ett event när ett asynkront databasanrop är färdigt.
Ett smidigt sätt att får reda på när en asynkron databasfråga är klar är att använda onQueryFinished-eventet.
I exemplet nedan skrivs värden från alla fält i den sista posten i tabellen ut.
Observera att database query-objektet inte finns förrän den asynkrona frågan ställts, därför behövs en extra if-sats.
if (get_data)
{
get_data = false;
var res = DB.AsyncQuery("select * from myTable;");
Debug.Print("Query started: " + res.TransactionID);
}
if (res != undefined)
{
res.onQueryFinished = function(event)
{
Debug.Print("Query finished: " + event.target.TransactionID);
for(var c in event.target.Columns)
{
Debug.Print(event.target.Columns[c] + " = " + event.target.Rows[event.target.RowCount-1][c]);
}
}
}
Eventargumentet event innehåller en rad egenskaper. Förutom standardegenskaperna i Java-skript innehåller den följande intressanta egenskaper:
currentTarget - Detta är en referens till det databas query-objekt eventet genereras på.
target - Detta är en referens till det database query-objekt som returnerades från AsyncQuery-anropet. Det är i detta objekt som resultatet av databasfrågan finns. Se vidare beskrivningen av database query-objektet ovan.
Tänk på att eventet kommer att bubbla upp till databasnivån. Du behöver bara lyssna på eventet på en nivå, antingen på database query-objektet eller på database-objektet.
Konstanter i Database query-objektet
Status
Dessa konstanter kan användas för att avgöra vilket tillstånd database query-objektet befinner sig i.
STATUS_ERROR -1
STATUS_RUNNING 0
STATUS_FINISHED 1