1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
|
<HTML>
<HEAD>
<TITLE>prguide.htm</TITLE>
<LINK REL="ToC" HREF="httoc.htm">
<LINK REL="Index" HREF="htindex.htm">
<LINK REL="Next" HREF="prguide9.htm">
<LINK REL="Previous" HREF="prguide7.htm"></HEAD>
<BODY BGCOLOR="#FFFFFF">
<P ALIGN=CENTER>
<A HREF="prguide7.htm" TARGET="_self"><IMG SRC="graprev.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="Previous Page"></A>
<A HREF="httoc.htm" TARGET="_self"><IMG SRC="gratoc.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="TOC"></A>
<A HREF="htindex.htm" TARGET="_self"><IMG SRC="graindex.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="Index"></A>
<A HREF="prguide9.htm" TARGET="_self"><IMG SRC="granext.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="Next Page"></A>
<HR ALIGN=CENTER>
<P>
<UL>
<LI>
<A HREF="#E9E9" >Retrieving Status and Error Information</A>
<UL>
<LI>
<A HREF="#E10E33" >Function Return Codes </A>
<LI>
<A HREF="#E10E34" >Retrieving Error Messages</A>
<LI>
<A HREF="#E10E35" >ODBC Error Messages</A>
<UL>
<LI>
<A HREF="#E11E36" >Error Text Format</A>
<LI>
<A HREF="#E11E37" >Sample Error Messages</A>
<UL>
<LI>
<A HREF="#E12E22" >Single-Tier Driver</A>
<LI>
<A HREF="#E12E23" >Multiple-Tier Driver</A>
<LI>
<A HREF="#E12E24" >Gateways</A>
<LI>
<A HREF="#E12E25" >Driver Manager</A></UL></UL>
<LI>
<A HREF="#E10E36" >Processing Error Messages</A></UL></UL>
<HR ALIGN=CENTER>
<A NAME="E9E9"></A>
<H1>
<FONT FACE="Arial"><B>RETRIEVING STATUS AND ERROR INFORMATION</B><A NAME="I2"></A><A NAME="I3"></A><A NAME="I4"></A><A NAME="I5"></A><A NAME="I6"></A></FONT></H1>
<BR>
<BLOCKQUOTE>
<P>This chapter defines the ODBC return codes and error handling protocol. The return codes indicate whether a function succeeded, succeeded but returned a warning, or failed. The error handling protocol defines how the components in an ODBC connection construct and return error messages through <B>SQLError</B>.<A NAME="I7"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>The protocol describes:<A NAME="I8"></A>
</BLOCKQUOTE>
<UL>
<BLOCKQUOTE>
<LI>Use of the error text to identify the source of an error.<A NAME="I9"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<LI>Rules to ensure consistent and useful error information.<A NAME="I10"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<LI>Responsibility for setting the ODBC SQLSTATE based on the native error.
</BLOCKQUOTE></UL>
<A NAME="E10E33"></A>
<H2>
<FONT FACE="Arial"><B>Function Return Codes</B><B> </B><A NAME="I11"></A><A NAME="I12"></A><A NAME="I13"></A><A NAME="I14"></A><A NAME="I15"></A><A NAME="I16"></A><A NAME="I17"></A><A NAME="I18"></A></FONT></H2>
<BLOCKQUOTE>
<P>When an application calls an ODBC function, the driver executes the function and returns a predefined code. These return codes indicate success, warning, or failure status. The following table defines the return codes.
</BLOCKQUOTE>
<TABLE WIDTH=650>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P><B>Return Code</B>
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E44"></A>
<P><B>Description</B></TD>
</TR>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P>SQL_SUCCESS
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E45"></A>
<P>Function completed successfully; no additional information is available.</TD>
</TR>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P>SQL_SUCCESS_WITH_INFO
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E46"></A>
<P>Function completed successfully, possibly with a nonfatal error. The application can call <B>SQLError</B> to retrieve additional information.</TD>
</TR>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P>SQL_NO_DATA_FOUND
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E47"></A>
<P>All rows from the result set have been fetched.</TD>
</TR>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P>SQL_ERROR
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E48"></A>
<P>Function failed. The application can call <B>SQLError</B> to retrieve error information.</TD>
</TR>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P>SQL_INVALID_HANDLE
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E49"></A>
<P>Function failed due to an invalid environment handle, connection handle, or statement handle. This indicates a programming error. No additional information is available from <B>SQLError</B>.</TD>
</TR>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P>SQL_STILL_EXECUTING
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E50"></A>
<P>A function that was started asynchronously is still executing.</TD>
</TR>
<TR>
<TD WIDTH=182 VALIGN=top >
<BLOCKQUOTE>
<P>SQL_NEED_DATA
</BLOCKQUOTE></TD>
<TD WIDTH=273 VALIGN=top >
<A NAME="E7E51"></A>
<P>While processing a statement, the driver determined that the application needs to send parameter data values.</TD></TR></TABLE><A NAME="I19"></A>
<BLOCKQUOTE>
<P>The application is responsible for taking the appropriate action based on the return code.
</BLOCKQUOTE>
<A NAME="E10E34"></A>
<H2>
<FONT FACE="Arial"><B>Retrieving Error Messages</B><A NAME="I20"></A><A NAME="I21"></A><A NAME="I22"></A><A NAME="I23"></A><A NAME="I24"></A></FONT></H2>
<BLOCKQUOTE>
<P>If an ODBC function other than <B>SQLError</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an application can call <B>SQLError</B> to obtain additional information. The application may need to call <B>SQLError</B> more than once to retrieve all the error messages from a function, since a function may return more than one error message. When the application calls a different function, the error messages from the previous function are deleted.<A NAME="I25"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>Additional error or status information can come from one of two sources:<A NAME="I26"></A>
</BLOCKQUOTE>
<UL>
<BLOCKQUOTE>
<LI>Error or status information from an ODBC function, indicating that a programming error was detected.<A NAME="I27"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<LI>Error or status information from the data source, indicating that an error occurred during SQL statement processing.<A NAME="I28"></A>
</BLOCKQUOTE></UL>
<BLOCKQUOTE>
<P>The information returned by <B>SQLError</B> is in the same format as that provided by SQLSTATE in the X/Open and SQL Access Group SQL CAE specification (1992). Note that <B>SQLError</B> never returns error information about itself.
</BLOCKQUOTE>
<A NAME="E10E35"></A>
<H2>
<FONT FACE="Arial"><B>ODBC Error Messages</B><A NAME="I29"></A><A NAME="I30"></A><A NAME="I31"></A></FONT></H2>
<BLOCKQUOTE>
<P>ODBC defines a layered architecture to connect an application to a data source. At its simplest, an ODBC connection requires two components: the Driver Manager and a driver.<A NAME="I32"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>A more complex connection might include more components: the Driver Manager, a number of drivers, and a (possibly different) number of DBMS’s. The connection might cross computing platforms and operating systems and use a variety of networking protocols.<A NAME="I33"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>As the complexity of an ODBC connection increases, so does the importance of providing consistent and complete error messages to the application, its users, and support personnel. Error messages must not only explain the error, but also provide the identity of the component in which it occurred. The identity of the component is particularly important to support personnel when an application uses ODBC components from more than one vendor. Because <B>SQLError</B> does not return the identity of the component in which the error occurred, this information must be embedded in the error text.
</BLOCKQUOTE>
<A NAME="E11E36"></A>
<H3>
<FONT FACE="Arial">Error Text Format<A NAME="I34"></A></FONT></H3>
<BLOCKQUOTE>
<P>Error messages returned by <B>SQLError</B> come from two sources: data sources and components in an ODBC connection. Typically, data sources do not directly support ODBC. Consequently, if a component in an ODBC connection receives an error message from a data source, it must identify the data source as the source of the error. It must also identify itself as the component that received the error.<A NAME="I35"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>If the source of an error is the component itself, the error message must explain this. Therefore, the error text returned by <B>SQLError</B> has two different formats: one for errors that occur in a data source and one for errors that occur in other components in an ODBC connection.<A NAME="I36"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>For errors that do not occur in a data source, the error text must use the format:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE><B>[</B><I>vendor-identifier</I><B>][</B><I>ODBC-component-identifier</I><B>]</B>
<BR><B> </B><I>component-supplied-text</I><A NAME="I37"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>For errors that occur in a data source, the error text must use the format:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE><B>[</B><I>vendor-identifier</I><B>][</B><I>ODBC-component-identifier</I><B>]</B>
<BR><B> </B><B>[</B><I>data-source-identifier</I><B>]</B> <I>data-source-supplied-text</I><A NAME="I38"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>The following table shows the meaning of each element.
</BLOCKQUOTE>
<TABLE >
<TR>
<TD WIDTH=220 VALIGN=top >
<BLOCKQUOTE>
<P><A NAME="I39"></A><B>Element</B>
</BLOCKQUOTE></TD>
<TD WIDTH=233 VALIGN=top >
<A NAME="E7E52"></A>
<P><B>Meaning</B></TD>
</TR>
<TR>
<TD WIDTH=220 VALIGN=top >
<BLOCKQUOTE>
<P><I>vendor-identifier</I>
</BLOCKQUOTE></TD>
<TD WIDTH=233 VALIGN=top >
<A NAME="E7E53"></A>
<P>Identifies the vendor of the component in which the error occurred or that received the error directly from the data source.</TD>
</TR>
<TR>
<TD WIDTH=220 VALIGN=top >
<BLOCKQUOTE>
<P><I>ODBC-component-identifier</I>
</BLOCKQUOTE></TD>
<TD WIDTH=233 VALIGN=top >
<A NAME="E7E54"></A>
<P>Identifies the component in which the error occurred or that received the error directly from the data source.</TD>
</TR>
<TR>
<TD WIDTH=220 VALIGN=top >
<BLOCKQUOTE>
<P><I>data-source-identifier</I>
</BLOCKQUOTE></TD>
<TD WIDTH=233 VALIGN=top >
<A NAME="E7E55"></A>
<P>Identifies the data source. For single-tier drivers, this is typically a file format, such as Xbase<SUP>1</SUP>. For multiple-tier drivers, this is the DBMS product.</TD>
</TR>
<TR>
<TD WIDTH=220 VALIGN=top >
<BLOCKQUOTE>
<P><I>component-supplied-text</I>
</BLOCKQUOTE></TD>
<TD WIDTH=233 VALIGN=top >
<A NAME="E7E56"></A>
<P>Generated by the ODBC component.</TD>
</TR>
<TR>
<TD WIDTH=220 VALIGN=top >
<BLOCKQUOTE>
<P><I>data-source-supplied-text</I>
</BLOCKQUOTE></TD>
<TD WIDTH=233 VALIGN=top >
<A NAME="E7E57"></A>
<P>Generated by the data source.</TD>
</TR>
<TR>
<TD COLSPAN=2 WIDTH=453 VALIGN=top >
<BLOCKQUOTE>
<P> 1<SUP> </SUP>In this case, the driver is acting as both the driver and the data source.
</BLOCKQUOTE></TD></TR></TABLE>
<BLOCKQUOTE>
<P>Note that the brackets (<B>[ ]</B>) are included in the error text; they do not indicate optional items.
</BLOCKQUOTE>
<A NAME="E11E37"></A>
<H3>
<FONT FACE="Arial">Sample Error Messages<A NAME="I40"></A></FONT></H3>
<BLOCKQUOTE>
<P>The following are examples of how various components in an ODBC connection might generate the text of error messages and how various drivers might return them to the application with <B>SQLError</B>. Note that these examples do not represent actual implementations of the error handling protocol. For more information on how an individual driver has implemented the protocol, see the documentation for that driver.
</BLOCKQUOTE>
<BLOCKQUOTE>
<A NAME="E12E22"></A>
<H4>
<FONT>Single-Tier Driver<A NAME="I41"></A></FONT></H4>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>A single-tier driver acts both as an ODBC driver and as a data source. It can therefore generate errors both as a component in an ODBC connection and as a data source. Because it also is the component that interfaces with the Driver Manager, it formats and returns arguments for <B>SQLError</B>.<A NAME="I42"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>For example, if a Microsoft driver for dBASE® could not allocate sufficient memory, it might return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = "S1001"
<BR>pfNativeError = NULL
<BR>szErrorMsg = "[Microsoft][ODBC dBASE Driver]Unable to allocate sufficient memory."
<BR>pcbErrorMsg = 67<A NAME="I43"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>Because this error was not related to the data source, the driver only added prefixes to the error text for the vendor ([Microsoft]) and the driver ([ODBC dBASE Driver]).<A NAME="I44"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>If the driver could not find the file EMPLOYEE.DBF, it might return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = "S0002"
<BR>pfNativeError = NULL
<BR>szErrorMsg = "[Microsoft][ODBC dBASE Driver][dBASE] Invalid file name;file EMPLOYEE.DBF not found."
<BR>pcbErrorMsg = 83<A NAME="I45"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>Because this error was related to the data source, the driver added the file format of the data source ([dBASE]) as a prefix to the error text. Because the driver was also the component that interfaced with the data source, it added prefixes for the vendor ([Microsoft]) and the driver ([ODBC dBASE Driver]).
</BLOCKQUOTE>
<BLOCKQUOTE>
<A NAME="E12E23"></A>
<H4>
<FONT>Multiple-Tier Driver<A NAME="I46"></A></FONT></H4>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>A multiple-tier driver sends requests to a DBMS and returns information to the application through the Driver Manager. Because it is the component that interfaces with the Driver Manager, it formats and returns arguments for <B>SQLError</B>.<A NAME="I47"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>For example, if a Microsoft driver for DEC’s Rdb using SQL/Services encountered a duplicate cursor name, it might return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = "3C000"
<BR>pfNativeError = NULL
<BR>szErrorMsg = "[Microsoft][ODBC Rdb Driver]
<BR> Duplicate cursor name:EMPLOYEE_CURSOR."
<BR>pcbErrorMsg = 67<A NAME="I48"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>Because the error occurred in the driver, it added prefixes to the error text for the vendor ([Microsoft]) and the driver ([ODBC Rdb Driver]).<A NAME="I49"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>If the DBMS could not find the table EMPLOYEE, the driver might format and return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = "S0002"
<BR>pfNativeError = -1
<BR>szErrorMsg = "[Microsoft][ODBC Rdb Driver][Rdb]
<BR> %SQL-F-RELNOTDEF, Table EMPLOYEE is not defined in schema."
<BR>pcbErrorMsg = 92<A NAME="I50"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>Because the error occurred in the data source, the driver added a prefix for the data source identifier ([Rdb]) to the error text. Because the driver was the component that interfaced with the data source, it added prefixes for its vendor ([Microsoft]) and identifier ([ODBC Rdb Driver]) to the error text.
</BLOCKQUOTE>
<BLOCKQUOTE>
<A NAME="E12E24"></A>
<H4>
<FONT>Gateways<A NAME="I51"></A><A NAME="I52"></A><A NAME="I53"></A></FONT></H4>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>In a gateway architecture, a driver sends requests to a gateway that supports ODBC. The gateway sends the requests to a DBMS. Because it is the component that interfaces with the Driver Manager, the driver formats and returns arguments for <B>SQLError</B>.<A NAME="I54"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>For example, if DEC based a gateway to Rdb on Microsoft Open Data Services, and Rdb could not find the table EMPLOYEE, the gateway might generate the following error text:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>"[S0002][-1][DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF, Table EMPLOYEE is not defined in schema."<A NAME="I55"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>Because the error occurred in the data source, the gateway added a prefix for the data source identifier ([Rdb]) to the error text. Because the gateway was the component that interfaced with the data source, it added prefixes for its vendor ([DEC]) and identifier ([ODS Gateway]) to the error text. Note that it also added the SQLSTATE value and the Rdb error code to the beginning of the error text. This permitted it to preserve the semantics of its own message structure and still supply the ODBC error information to the driver.<A NAME="I56"></A>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>Because the gateway driver is the component that interfaces with the Driver Manager, it would use the preceding error text to format and return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = "S0002"
<BR>pfNativeError = -1
<BR>szErrorMsg = "[DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF, Table EMPLOYEE is not defined in schema."
<BR>pcbErrorMsg = 81</PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<A NAME="E12E25"></A>
<H4>
<FONT>Driver Manager<A NAME="I57"></A></FONT></H4>
</BLOCKQUOTE>
<BLOCKQUOTE>
<P>The Driver Manager can also generate error messages. For example, if an application passed an invalid argument value to <B>SQLDataSources</B>, the Driver Manager might format and return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = "S1009"
<BR>pfNativeError = NULL
<BR>szErrorMsg = "[Microsoft][ODBC DLL]Invalid argument value: SQLDataSources."
<BR>pcbErrorMsg = 60<A NAME="I58"></A></PRE></BLOCKQUOTE>
<BLOCKQUOTE>
<P>Because the error occurred in the Driver Manager, it added prefixes to the error text for its vendor ([Microsoft]) and its identifier ([ODBC DLL]).
</BLOCKQUOTE>
<A NAME="E10E36"></A>
<H2>
<FONT FACE="Arial"><B>Processing Error Messages</B><A NAME="I59"></A></FONT></H2>
<BLOCKQUOTE>
<P>Applications should provide users with all the error information available through <B>SQLError</B>: the ODBC SQLSTATE, the native error code, the error text, and the source of the error. The application may parse the error text to separate the text from the information identifying the source of the error. It is the application’s responsibility to take appropriate action based on the error or provide the user with a choice of actions.
</BLOCKQUOTE><P ALIGN=CENTER>
<A HREF="prguide7.htm" TARGET="_self"><IMG SRC="graprev.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="Previous Page"></A>
<A HREF="httoc.htm" TARGET="_self"><IMG SRC="gratoc.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="TOC"></A>
<A HREF="htindex.htm" TARGET="_self"><IMG SRC="graindex.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="Index"></A>
<A HREF="prguide9.htm" TARGET="_self"><IMG SRC="granext.gif" WIDTH = 32 HEIGHT = 32 BORDER = 0 ALT="Next Page"></A>
<center><p><font SIZE=-2>Copyright © 1992-1997 Solid Information Technology Ltd All rights reserved.</font></p></center>
</BODY></HTML>
|