File: prguide8.htm

package info (click to toggle)
solid-doc 2.2-1
  • links: PTS
  • area: non-free
  • in suites: potato, slink
  • size: 3,436 kB
  • ctags: 11,371
  • sloc: makefile: 58; sh: 2
file content (382 lines) | stat: -rw-r--r-- 19,171 bytes parent folder | download | duplicates (2)
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&#146;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&#174; could not allocate sufficient memory, it might return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = &quot;S1001&quot;
<BR>pfNativeError = NULL
<BR>szErrorMsg = &quot;[Microsoft][ODBC dBASE Driver]Unable to    allocate sufficient memory.&quot;
<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 = &quot;S0002&quot;
<BR>pfNativeError = NULL
<BR>szErrorMsg = &quot;[Microsoft][ODBC dBASE Driver][dBASE]    Invalid file name;file EMPLOYEE.DBF not found.&quot;
<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&#146;s Rdb using SQL/Services encountered a duplicate cursor name, it might return the following arguments for <B>SQLError</B>:
</BLOCKQUOTE>
<BLOCKQUOTE>
<PRE>szSQLState = &quot;3C000&quot;
<BR>pfNativeError = NULL
<BR>szErrorMsg = &quot;[Microsoft][ODBC Rdb Driver]
<BR>   Duplicate cursor name:EMPLOYEE_CURSOR.&quot;
<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 = &quot;S0002&quot;
<BR>pfNativeError = -1
<BR>szErrorMsg = &quot;[Microsoft][ODBC Rdb Driver][Rdb] 
<BR>   %SQL-F-RELNOTDEF, Table EMPLOYEE is not defined in    schema.&quot;
<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>&quot;[S0002][-1][DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF,    Table EMPLOYEE is not defined in schema.&quot;<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 = &quot;S0002&quot;
<BR>pfNativeError = -1
<BR>szErrorMsg = &quot;[DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF,    Table EMPLOYEE is not defined in schema.&quot;
<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 = &quot;S1009&quot;
<BR>pfNativeError = NULL
<BR>szErrorMsg = &quot;[Microsoft][ODBC DLL]Invalid argument    value: SQLDataSources.&quot;
<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&#146;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 &copy; 1992-1997 Solid Information Technology Ltd All rights reserved.</font></p></center>
</BODY></HTML>