Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » UltraLite - M-Business Anywhere-Programmierung » Entwicklung mit UltraLite für M-Business Anywhere

 

Beständige Namen in M-Business Anywhere-Anwendungen

Wenn in HTML die Steuerung auf eine neue Seite übergeht, gehen alle Handles für zugeordnete JavaScript-Objekte aus der alten Seite verloren. In main.html ist z.B. ein M-Business Anywhere-Datenbankverbindungsobjekt vorhanden:

conn = dbMgr.openConnection("...");

Wenn Sie auf einen Link in main.html klicken und auf eine andere Seite gelangen (z.B. insert.html), ist das Objekt "conn" in insert.html nicht vorhanden. Um das Verbindungsobjekt wieder zu erhalten, müssen Sie möglicherweise dbMgr.openConnection("...") erneut aufrufen. Dies ist jedoch nicht erforderlich, da sich das Verbindungsobjekt noch im Speicher befindet und nur das JavaScript-Handle dazu verloren wurde.

Aus diesem Grund gibt es in allen M-Business Anywhere API-Aufrufen von DataManager, Connection, ULTable, PreparedStatement und ResultSet das Argument persistName. Wenn z.B. die M-Business Anywhere-Laufzeitanwendung einen Aufruf von JavaScript für ein UltraLite-Verbindungsobjekt erhält, überprüft M-Business Anywhere zunächst, ob im Speicher ein Verbindungsobjekt mit demselben persistName-Argument vorhanden ist. Wenn die Laufzeitanwendung ein übereinstimmendes Objekt findet, gibt es das Verbindungsobjekt zurück. Andernfalls durchläuft M-Business Anywhere die normale Prozedur, um eine neue UltraLite-Datenbankverbindung herzustellen und sie zurückzugeben.

Beständige Namen verwenden

Es gibt bei den M-Business Anywhere-Objekten zwei Typen von Hierarchie. Beide starten mit DatabaseManager und Connection:

Um eines dieser M-Business Anywhere-Objekte mit einem beständigen Namen abzurufen, müssen Sie das oberste Objekt mit einem beständigen Namen abrufen und dann alle M-Business Anywhere-Objekte der oberen Ebenen der Hierarchie nacheinander abrufen, bis das gewünschte Objekt gefunden wird.

Wenn Sie z.B. ein vorhandenes ULTable-Objekt aus insert.html abrufen wollen, müssen Sie dbMgr-, conn- und table-Objekten in main.html einen beständigen Namen geben und dann in insert.html beständige Namen verwenden, um sie alle zurück zu erhalten:

Codesegment für main.html:

var dbMgr = CreateObject( "iAnywhere.UltraLite.DatabaseManager.simple" ); 
// "simple" is the persistent name here. A real database manager object is allocated

var conn = dbMgr.openConnection( "CON=simple_con;..." ); 
// "simple_con" is the persistent name here. A real database connection is made.

var custTable = conn.getTable( "ULCustomer", "simpleCustTable" ); 
// a real table is allocated

Codesegment für insert.html:

var dbMgr = CreateObject( "iAnywhere.UltraLite.DatabaseManager.simple" ); 
// "simple" is the persistent name here. 
// The allocated database manager object from main.html is returned

var conn = dbMgr.openConnection( "CON=simple_con;..." ); 
// "simple_con" is the persistent name here. 
// The existing connection object from memory is returned.

var custTable = conn.getTable( "ULCustomer", "simpleCustTable" ); 
// the existing table object is returned.

var newTable = conn.getTable( "ULOrder", "simpleOrderTable" ); 
// since there is no order table from main.html, 
// it does not exist in memory. A real order table object is allocated.
Beständige Namen richtig verwenden

Stellen Sie den gewöhnlich verwendeten Code in eine JavaScript-Datei. Da die meisten HTML-Seiten einer M-Business Anywhere-Anwendung DatabaseManager-, Connection- und einige wichtige ULTable-Objekte referenzieren müssen, empfiehlt es sich, den Code, der diese Objekte erstellt (oder mit einem beständigen Namen abruft), in eine gemeinsame JavaScript-Datei zu stellen und diese Datei oben auf den HTML-Seiten, die sie verwenden, einzubeziehen. Die M-Business Anywhere-Beispielprogramme simple und CustDB veranschaulichen diese Vorgehensweise.

Schließen Sie das Objekt, wenn Sie nicht planen, es von einer anderen Seite aus zu verwenden. Wenn die M-Business Anywhere-Anwendung nur eine HTML-Seite hat, ist es nicht erforderlich, beständige Namen zu verwenden. Das Argument für beständige Namen kann dann auf NULL gesetzt werden. Wenn andererseits jede HTML-Seite viele geöffnete PreparedStatement- und ResultSet-Objekte enthält, muss der Entwickler zwischen dem Vorteil, sie im Speicher zu halten, um sie einfach mit einem beständigen Namen von einer anderen HTML-Seite abzurufen, und einer verschwendeten Speichernutzung durch die ständige Präsenz dieser Objekte abwägen. Beispiel: Sie haben 5 PreparedStatement-Objekte und 10 ResultSet-Objekte in main.html erstellt. Sie belegen eine beträchtliche Menge an Speicher. Wenn die Anwendung zu insert.html springt und Sie nur einige dieser Objekte mit einem beständigen Namen referenzieren müssen, dann verschwenden die nicht mehr benötigten Objekte Speicherplatz. Wenn Sie versuchen, neue PreparedStatement- und ResultSet-Objekte in insert.html zu erstellen, ist der Speicher möglicherweise erschöpft. Die Lösung besteht darin, diese PreparedStatement- oder ResultSet-Objekte am Ende einer main.html zu löschen, wenn Sie sicher sind, dass Sie sie in insert.html nicht brauchen.

Der Status der verschiedenen M-Business Anywhere-Objekte wird bewahrt, wenn sie mit einem beständigen Namen abgerufen werden. Wenn Sie ein beständiges ULTable-Objekt auf Seite 1 haben und Sie die Methode openTable auf Seite 2 mit demselben beständigen Namen abrufen, erhalten Sie genau dasselbe ULtable-Objekt mit demselben Status wie von Seite 1 zurück. Wenn der Cursor sich in der n-ten Zeile der Tabelle befindet, wenn Sie Seite 1 verlassen, befindet sich der Cursor weiterhin in der n-ten Zeile, wenn Sie ihn auf Seite 2 abrufen. Er befindet sich nicht "vor der ersten Zeile".

Verwenden Sie den beständigen Namen für ResultSet mit Umsicht. Wenn im PreparedStatement-Objekt Platzhalter verwendet werden, müssen Sie genau abwägen, ob Sie dem ResultSet-Objekt einen beständigen Namen geben wollen. Beispiel: In main.html ist folgender Code enthalten:

var OrderStmt = Connection.prepareStatement(
"SELECT order_id, disc, quant FROM ULOrder WHERE order_id = ?", 
"order_query_stmt" );

OrderStmt.setInt(1, 5000);

var OrderResultSet = OrderStmt.executeQuery( "order_query_result" );

Um in insert.html dasselbe ResultSet-Objekt zu verwenden, verwenden Sie folgenden Code:

var OrderStmt = Connection.prepareStatement(
"SELECT order_id, disc, quant FROM ULOrder WHERE order_id = ?", 
"order_query_stmt" );

//OrderStmt.setInt(1, 5000); // no need to do this since both the OrderStmt and 
OrderResultSet are retrieve from "cache" without any SQL statement being 
actually executed

var OrderResultSet = OrderStmt.executeQuery( "order_query_result" );

Dieses OrderResultSet-Objekt enthält dasselbe Ergebnis, da die order_id auf 5000 gesetzt ist.

Die Situation könnte jedoch auch anders aussehen. Sie wollen dasselbe PreparedStatement-Objekt benutzen, da Sie dieselbe Abfrage für die Tabelle Order verwenden möchten. Sie möchten die Abfrage jedoch mit einer anderen order_id als 5000 durchführen. In diesem Fall können Sie dem PreparedStatement-Objekt einen beständigen Namen zuweisen, doch Sie brauchen keinen beständigen Namen für das ResultSet-Objekt. Da die order_id in diesem Fall unterschiedlich ist, unterscheidet sich auch die Ergebnismenge von der vorherigen. In main.html geben Sie auch in diesem Fall Folgendes an:

var OrderStmt = Connection.prepareStatement(
"SELECT order_id, disc, quant FROM ULOrder WHERE order_id = ?", 
"order_query_stmt" ); // with persistent name

OrderStmt.setInt(1, 5000);

var OrderResultSet = OrderStmt.executeQuery( null ); // notice here, no persistent name

In insert.html verwenden Sie folgenden Code, um ein neues ResultSet-Objekt zu erhalten:

var OrderStmt = Connection.prepareStatement(
"SELECT order_id, disc, quant FROM ULOrder WHERE order_id = ?", 
"order_query_stmt" ); // get the prepared statement from memory with persistent name

OrderStmt.setInt(1, 6000); // set a different place holder value

var OrderResultSet = OrderStmt.executeQuery( null ); // a real query is executed 
here!

In diesem Beispiel ist zu erwarten, dass die zurückgegebene Ergebnismenge unterschiedlich ist, da der Platzhalterwert anders lautet oder eine andere Operation für die Tabelle Order ausgeführt wird. Aus diesem Grund verwenden Sie keinen beständigen Namen für das ResultSet-Objekt, wenn Sie executeQuery aufrufen.