database object. You indicate that you want to use this object by calling its connect method.
database object when an application connects to a database server. Each application has only one database object. You can use the database object to interact with the database on the server. Alternatively, you can use the DbPool and Connection objects.
You can use the database object to connect to the database server and perform the following tasks:
database object as an instance of the DbBuiltin class. In most circumstances, this is an implementation detail you do not need to be aware of, because you cannot create instances of this class. However, you can use the prototype property of the DbBuiltin class to add a property to the predefined database object. If you do so, that addition applies to the database object when used in all applications on your server, not just in the single application that made the change. This allows you to expand the capabilities of this object for your entire server.
Transactions.
A transaction is a group of database actions that are performed together. Either all the actions succeed together or all fail together. When you attempt to have all of the actions make permanent changes to the database, you are said to commit a transaction. You can also roll back a transaction that you have not committed; this cancels all the actions.
You can use explicit transaction control for any set of actions, by using the beginTransaction, commitTransaction, and rollbackTransaction methods. If you do not control transactions explicitly, the runtime engine uses the underlying database's auto-commit feature to treat each database modification as a separate transaction. Each statement is either committed or rolled back immediately, based on the success or failure of the individual statement. Explicitly managing transactions overrides this default behavior.
In some databases, such as Oracle, auto-commit is an explicit feature that LiveWire turns on for individual statements. In others, such as Informix, it is the default behavior when you do not create a transaction.
NOTE: You must use explicit transaction control any time you make changes to a database. If you do not, your database may return errors; even it does not, you cannot be guaranteed of data integrity without using transactions. In addition, any time you use cursors, you are encourage to use explicit transactions to control the consistency of your data.For the
database object, the scope of a transaction is limited to the current request (HTML page) in an application. If the application exits the page before calling the commitTransaction or rollbackTransaction method, then the transaction is automatically either committed or rolled back, depending on the setting for the commitflag parameter when the connection was established. This parameter is provided either to the pool object's constructor or to its connect method. For further information, see connect.
| Property |
Description
| |
|---|
watch and unwatch methods from Object.
database object and opens a standard connection to the customer database on an Informix server. The name of the server is blue, the user name is ADMIN, and the password is MANAGER.
database.connect("INFORMIX", "blue", "ADMIN", "MANAGER", "inventory")
In this example, many clients can connect to the database simultaneously, but they all share the same connection, user name, and password.
Cursor, database.connect
beginTransaction()
majorErrorCode and majorErrorMessage methods to interpret the cause of the error.
database object, the scope of a transaction is limited to the current request (HTML page) in the application. If the application exits the page before calling the commitTransaction or rollbackTransaction method, then the transaction is automatically either committed or rolled back, based on the setting of the commitflag parameter when the connection was established. This parameter is provided when you make the connection by calling database.connect.
For Connection objects, the scope of a transaction is limited to the lifetime of that object. If the connection is released or the pool of connections is closed before calling the commitTransaction or rollbackTransaction method, then the transaction is automatically either committed or rolled back, based on the setting of the commitflag parameter when the connection was established. This parameter is provided when you make the connection by calling the connect method or in the DbPool constructor.
If there is no current transaction (that is, if the application has not called beginTransaction), calls to commitTransaction and rollbackTransaction are ignored.
The LiveWire Database Service does not support nested transactions. If you call beginTransaction when a transaction is already open (that is, you've called beginTransaction and have yet to commit or roll back that transaction), you'll get an error message.
rentals table within a transaction. The values of customerID and videoID are passed into the cursor method as properties of the request object. When the videoReturn Cursor object opens, the next method navigates to the only record in the virtual table and updates the value in the returnDate field.
The variable x is assigned a database status code to indicate if the updateRow method is successful. If updateRow succeeds, the value of x is 0, and the transaction is committed; otherwise, the transaction is rolled back.
// Begin a transaction
database.beginTransaction();
// Create a Date object with the value of today's date
today = new Date();
// Create a cursor with the rented video in the virtual table
videoReturn = database.cursor("SELECT * FROM rentals WHERE
customerId = " + request.customerID + " AND
videoId = " + request.videoID, true);
// Position the pointer on the first row of the cursor
// and update the row
videoReturn.next()
videoReturn.returndate = today;
x = videoReturn.updateRow("rentals");
// End the transaction by committing or rolling back
if (x == 0) {
database.commitTransaction() }
else {
database.rollbackTransaction() }
// Close the cursor
videoReturn.close();
commitTransaction()
majorErrorCode and majorErrorMessage methods to interpret the cause of the error.
beginTransaction.
For the database object, the scope of a transaction is limited to the current request (HTML page) in the application. If the application exits the page before calling the commitTransaction or rollbackTransaction method, then the transaction is automatically either committed or rolled back, based on the setting of the commitflag parameter when the connection was established. This parameter is provided when you make the connection with the database or DbPool object.
For Connection objects, the scope of a transaction is limited to the lifetime of that object. If the connection is released or the pool of connections is closed before calling the commitTransaction or rollbackTransaction method, then the transaction is automatically either committed or rolled back, based on the commitFlag value.
If there is no current transaction (that is, if the application has not called beginTransaction), calls to commitTransaction and rollbackTransaction are ignored.
The LiveWire Database Service does not support nested transactions. If you call beginTransaction when a transaction is already open (that is, you've called beginTransaction and have yet to commit or roll back that transaction), you'll get an error message.
1. connect (dbtype, serverName, username, password,
databaseName)
2. connect (dbtype, serverName, username, password,
databaseName [, maxConnections])
3. connect (dbtype, serverName, username, password,
databaseName [, maxConnections [, commitflag]])
majorErrorCode and majorErrorMessage methods to interpret the cause of the error.
maxConnections parameter. If successful, it stores those connections for later use. If the runtime engine does not obtain the requested connections, it returns an error. When this connection goes out of scope, pending transactions are rolled back.
The third version of this method does everything the second version does. In addition, the commitflag parameter indicates what to do with pending transactions when this connection goes out of scope. If this parameter is false (the default), a pending transaction is rolled back. If this parameter is true, a pending transaction if committed.
If possible, your application should call this method on its initial page. Doing so prevents conflicts from multiple client requests trying to connect and disconnect.
database.connect("INFORMIX", "myserv", "SYSTEM", "MANAGER", "mydb", 4)
connected()
connected method indicates whether this object is currently connected to a database.
If this method returns false for a Connection object, you cannot use any other methods of that object. You must reconnect to the database, using the DbPool object, and then get a new Connection object. Similarly, if this method returns false for the database object, you must reconnect before using other methods of that object.
myconn variable.
if (!myconn.connected()) {
mypool.connect ("INFORMIX", "myserver", "SYSTEM", "MANAGER", "mydb", 4);
myconn = mypool.connection;
}
Example 2: The following example uses an if condition to determine if an application is connected to a database server. If the application is connected, the isConnectedRoutine function runs; if the application is not connected, the isNotConnected routine runs.
if(database.connected()) {
isConnectedRoutine() }
else {
isNotConnectedRoutine() }
Cursor object.cursor(sqlStatement[, updatable])
sqlStatement | A JavaScript string representing a SQL SELECT statement supported by the database server. |
updatable |
A |
Cursor object.
cursor method creates a Cursor object that contains the rows returned by a SQL SELECT statement. The SELECT statement is passed to the cursor method as the sqlStatement argument. If the SELECT statement does not return any rows, the resulting Cursor object has no rows. The first time you use the next method on the object, it returns false.
You can perform the following tasks with the Cursor object:
cursor method does not automatically display the returned data. To display this data, you must create custom HTML code. This HTML code may display the rows in an HTML table, as shown in Example 3. The SQLTable method is an easier way to display the output of a database query, but you cannot navigate, modify data, or control the format of the output.
The optional parameter updatable specifies whether you can modify the Cursor object you create with the cursor method. To create a Cursor object you can modify, specify updatable as true. If you do not specify a value for the updatable parameter, it is false by default.
If you create an updatable Cursor object, the virtual table returned by the sqlStatement parameter must be updatable. For example, the SELECT statement in the sqlStatement parameter cannot contain a GROUP BY clause; in addition, the query usually must retrieve key values from a table. For more information on constructing updatable queries, consult your database vendor's documentation.
custs and returns the columns ID, CUST_NAME, and CITY from the customer table:
custs=database.cursor("select id, cust_name, city from customer", true)
Example 2. You can construct the SELECT statement with the string concatenation operator (+) and string variables such as client or request property values, as shown in the following example:
custs = database.cursor("select * from customer
where customerID = " + request.customerID);
Example 3. The following example demonstrates how to format the virtual table returned by the cursor method as an HTML table. This example first creates Cursor object named videoSet and then displays two columns of its data (videoSet.title and videoSet.synopsis).
// Create the videoSet cursor
<SERVER>
videoSet = database.cursor("select * from videos
where videos.numonhand > 0 order by title");
</SERVER>
// Begin creating an HTML table to contain the virtual table
// Specify titles for the two columns in the virtual table
<TABLE BORDER>
<CAPTION> Videos on Hand </CAPTION>
<TR>
<TH>Title</TH>
<TH>Synopsis</TH>
</TR>
// Use a while loop to iterate over each row in the cursor
<SERVER>
while(videoSet.next()) {
</SERVER>
// Use write statements to display the data in both columns
<TR>
<TH><A HREF=\Q"rent.html?videoID="+videoSet.id\Q>
<SERVER>write(videoSet.title)</SERVER></A></TH>
<TD><SERVER>write(videoSet.synopsis)</SERVER></TD>
</TR>
// End the while loop
<SERVER>
}
</SERVER>
// End the HTML tableThe values in the
</TABLE>
videoSet.title column are displayed within the A tag so a user can click them as links. When a user clicks a title, the rent.html page opens and the column value videoSet.id is passed to it as the value of request.videoID.
database.SQLTable, database.cursor
disconnect()
majorErrorCode and majorErrorMessage methods to interpret the cause of the error.
disconnect method, you must first call the release method for all connections in this database pool. Otherwise, the connection is still considered in use by the system, so the disconnect waits until all connections are released.
After disconnecting from a database, the only methods of this object you can use are connect and connected.
if condition to determine if an application is connected to a database server. If the application is connected, the application calls the disconnect method; if the application is not connected, the isNotConnected routine runs.
if(database.connected()) {
database.disconnect() }
else {
isNotConnectedRoutine() }
execute (stmt)
stmt |
majorErrorCode and majorErrorMessage methods to interpret the cause of the error.
CREATE, ALTER, or DROP.
Each database supports a standard core of DDL and DML statements. In addition, they may each also support DDL and DML statements specific to that database vendor. You can use execute to call any of those statements. However, each database vendor may also provide functions you can use with the database that are not DDL or DML statements. You cannot use execute to call those functions. For example, you cannot call the Oracle describe function or the Informix load function from the execute method.
Although technically you can use execute to perform data modification (INSERT, UPDATE, and DELETE statements), you should instead use Cursor objects. This makes your application more database-independent. Cursors also provide support for binary large object (BLOb) data.
When using the execute method, your SQL statement must strictly conform to the syntax requirements of the database server. For example, some servers require each SQL statement to be terminated by a semicolon. See your server documentation for more information.
If you have not explicitly started a transaction, the single statement is automatically committed.
execute method is used to delete a customer from the customer table. customer.ID represents the unique ID of a customer that is in the ID column of the customer table. The value for customer.ID is passed into the DELETE statement as the value of the ID property of request.
if(request.ID != null) {
database.execute("delete from customer
where customer.ID = " + request.ID)
}
majorErrorCode()
Table 1.2 Database status codes.
| Status code | Explanation | Status code |
Explanation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|---|
rentals table within a transaction. The updateRow method assigns a database status code to the statusCode variable to indicate whether the method is successful.
If updateRow succeeds, the value of statusCode is 0, and the transaction is committed. If updateRow returns a statusCode value of either five or seven, the values of majorErrorCode, majorErrorMessage, minorErrorCode, and minorErrorMessage are displayed. If statusCode is set to any other value, the errorRoutine function is called.
database.beginTransaction()
statusCode = cursor.updateRow("rentals")
if (statusCode == 0) {
database.commitTransaction()
}if (statusCode == 5 || statusCode == 7) {
write("The operation failed to complete.<BR>"
write("Contact your system administrator with the following:<P>"
write("The value of statusCode is " + statusCode + "<BR>")
write("The value of majorErrorCode is " +
database.majorErrorCode() + "<BR>")
write("The value of majorErrorMessage is " +
database.majorErrorMessage() + "<BR>")
write("The value of minorErrorCode is " +
database.minorErrorCode() + "<BR>")
write("The value of minorErrorMessage is " +
database.minorErrorMessage() + "<BR>")
database.rollbackTransaction()
}else {
errorRoutine()
}
SQLCODE.majorErrorMessage()
connection and DbPool methods or from special connection or DbPool properties containing error messages and codes.
database.majorErrorCode.
minorErrorCode()
ISAM error code, or 0 if there is no ISAM error.minorErrorMessage()
DbBuiltin class to add properties or methods to the database object. For information on prototypes, see Function.prototype.rollbackTransaction()
majorErrorCode and majorErrorMessage methods to interpret the cause of the error.
beginTransaction.
For the database object, the scope of a transaction is limited to the current request (HTML page) in the application. If the application exits the page before calling the commitTransaction or rollbackTransaction method, then the transaction is automatically either committed or rolled back, based on the setting of the commitflag parameter when the connection was established. This parameter is provided when you make the connection with the database or DbPool object.
For Connection objects, the scope of a transaction is limited to the lifetime of that object. If the connection is released or the pool of connections is closed before calling the commitTransaction or rollbackTransaction method, then the transaction is automatically either committed or rolled back, based on the commitFlag value.
If there is no current transaction (that is, if the application has not called beginTransaction), calls to commitTransaction and rollbackTransaction are ignored.
The LiveWire Database Service does not support nested transactions. If you call beginTransaction when a transaction is already open (that is, you've called beginTransaction and have yet to commit or roll back that transaction), you'll get an error message.
SQLTable (stmt)
stmt |
SQLTable does not give explicit control over how the output is formatted, it is the easiest way to display query results. If you want to customize the appearance of the output, use a Cursor object to create your own display function.
NOTE: Every Sybase table you use with a cursor must have a unique index.
connobj is a Connection object and request.sql contains an SQL query, then the following JavaScript statements display the result of the query in a table:
write(request.sql)The first line simply displays the SELECT statement, and the second line displays the results of the query. This is the first part of the HTML generated by these statements:
connobj.SQLTable(request.sql)
select * from videosAs this example illustrates,
<TABLE BORDER>
<TR>
<TH>title</TH>
<TH>id</TH>
<TH>year</TH>
<TH>category</TH>
<TH>quantity</TH>
<TH>numonhand</TH>
<TH>synopsis</TH>
</TR>
<TR>
<TD>A Clockwork Orange</TD>
<TD>1</TD>
<TD>1975</TD>
<TD>Science Fiction</TD>
<TD>5</TD>
<TD>3</TD>
<TD> Little Alex, played by Malcolm Macdowell,
and his droogies stop by the Miloko bar for a
refreshing libation before a wild night on the town.
</TD>
</TR>
<TR>
<TD>Sleepless In Seattle</TD>
...
SQLTable generates an HTML table, with column headings for each column in the database table and a row in the table for each row in the database table.
storedProc (procName [, inarg1 [, inarg2 [, ... inargN]]])
procName | A string specifying the name of the stored procedure to run. |
inarg1, ..., inargN | The input parameters to be passed to the procedure, separated by commas. |
Stproc object.
storedProc must be invoked on the same application page as the page on which the object is created.
When you create a stored procedure, you can specify default values for any of
the parameters. Then, if a parameter is not included when the stored procedure
is executed, the procedure uses the default value. However, when you call a
stored procedure from a server-side JavaScript application, you must indicate
that you want to use the default value by typing "/Default/" in place of the
parameter. (Remember that JavaScript is case sensitive.) For example:
spObj = connobj.storedProc ("newhire", "/Default/", 3)
storedProcArgs (procName [, type1 [, ..., typeN]])
procName | |
type1, ..., typeN |
inoutdemo stored procedure takes one input parameter and one input/output parameter, as follows:
create procedure inoutdemo ( @inparam int, @inoutparam int output)Assume execute the following code and then call
as
if ( @inoutparam == null)
@inoutparam = @inparam + 1
else
@inoutparam = @inoutparam + 1
outParameters(0), the result will be 101:
database.storedProcArgs("inoutdemo", "IN", "INOUT")
spobj= database.storedProc("inoutdemo", 6, 100);
answer = spobj.outParameters(0);
The value of answer is 101. On the other hand, assume you execute this code:
database.storedProcArgs("inoutdemo", "IN", "OUT")
spobj = database.storedProc("inoutdemo", 6, 100);
answer = spobj.outParameters(0);
In this case, the value of answer is 7.
toString()
toString method that is automatically called when it is to be represented as a text value or when an object is referred to in a string concatenation.
You can use toString within your own code to convert an object into a string, and you can create your own function to be called in place of the default toString method.
This method returns a string of the following format:
db "name" "userName" "dbtype" "serverName"where
name | |
userName | |
dbType | |
serverName |
toString method, see the Object.toString method.
Last Updated: 11/13/98 10:22:56
Any sample code included above is provided for your use on an "AS IS" basis, under the Netscape License Agreement - Terms of Use