]> git.saurik.com Git - wxWidgets.git/blob - docs/latex/wx/tdb.tex
Ownerdrawn updates
[wxWidgets.git] / docs / latex / wx / tdb.tex
1 \section{Database classes overview}\label{odbcoverview}
2
3 \normalboxd{The more sophisticated wxODBC classes (wxDb/wxDbTable) are the
4 recommended classes for doing database/ODBC work with wxWindows. These new
5 classes replace the wxWindows v1.6x classes wxDatabase. Documentation for the
6 old wxDatabase class and its associated classes is still
7 included in the class documentation and in this overview section, but support
8 for these old classes has been phased out, and all future development work
9 is being done solely on the new wxDb/wxDbTable classes.}
10
11 \subsection{Different ODBC Class Libraries in wxWindows}
12
13 Following is detailed overview of how to use the wxWindows ODBC classes - \helpref{wxDb}{wxdb}
14 and \helpref{wxDbTable}{wxdbtable} and their associated functions. These are
15 the ODBC classes donated by Remstar International, and are collectively
16 referred to herein as the wxODBC classes. Since their initial inclusion with
17 wxWindows v2.x, they have become the standard wxWindows classes for database
18 access.
19
20 An older version of some classes ported over from wxWindows v1.68 still exist
21 (see \helpref{wxDatabase}{wxdatabase} in odbc.cpp), but are now deprecated in favor of the more
22 robust and comprehensive wxDb/wxDbTable classes. All current and future
23 feature development, as well as active debugging, are only being done on
24 the wxODBC classes. Documentation for the older classes is still provided
25 in this manual. The \helpref{wxDatabase overview}{wxdatabaseoverview} of the
26 older classes follows the overview of the new classes.
27
28 \subsection{wxDb/wxDbTable wxODBC Overview}\label{wxodbcoverview}
29
30 Classes: \helpref{wxDb}{wxdb}, \helpref{wxDbTable}{wxdbtable}
31
32 The wxODBC classes were designed for database independence. Although SQL and
33 ODBC both have standards which define the minimum requirements they must
34 support to be in compliance with specifications, different database vendors
35 may implement things slightly different. One example of this is that Oracle
36 requires all user names for the datasources to be supplied in uppercase
37 characters. In situations like this, the wxODBC classes have been written
38 to make this transparent to the programmer when using functions that require
39 database specific syntax.
40
41 Currently several major databases, along with other widely used databases,
42 have been tested and supported through the wxODBC classes. The list of
43 supported databases is certain to grow as more users start implementing
44 software with these classes, but at the time of the writing of this document,
45 users have successfully used the classes with the following datasources:
46
47 \begin{itemize}\itemsep=0pt
48 \item Oracle (v7, v8, v8i)
49 \item Sybase (ASA and ASE)
50 \item MS SQL Server (v7 - minimal testing)
51 \item MS Access (97 and 2000)
52 \item MySQL
53 \item DBase (IV, V)**
54 \item PostgreSQL
55 \item INFORMIX
56 \item VIRTUOSO
57 \item DB2
58 \end{itemize}
59
60 An up-to-date list can be obtained by looking in the comments of the function
61 \helpref{wxDb::Dbms}{wxdbdbms} in db.cpp, or in the enumerated type
62 \helpref{wxDBMS}{wxdbenumeratedtypes} in db.h.
63
64 **dBase is not truly an ODBC datasource, but there are drivers which can
65 emulate much of the functionality of an ODBC connection to a dBase table.
66 See the \helpref{wxODBC Known Issues}{wxodbcknownissues} section of this
67 overview for details.
68
69
70 \subsection{wxODBC Where To Start}\label{wxodbcwheretostart}
71
72 First, if you are not familiar with SQL and ODBC, go to your local bookstore
73 and pick up a good book on each. This documentation is not meant to teach
74 you many details about SQL or ODBC, though you may learn some just from
75 immersion in the subject.
76
77 If you have worked with non-SQL/ODBC datasources before, there are some
78 things you will need to un-learn. First some terminology as these phrases will
79 be used heavily in this section of the manual.
80
81 \begin{twocollist}\itemsep=0pt
82 \twocolitem{Datasource}{(usually a database) that contains the data that will be
83 accessed by the wxODBC classes.}
84 \twocolitem{Data table}{The section of the datasource that contains the rows and
85 columns of data.}
86 \twocolitem{ODBC driver}{The middle-ware software that interprets the ODBC
87 commands sent by your application and converts them to the SQL format expected
88 by the target datasource.}
89 \twocolitem{Datasource connection}{An open pipe between your application and
90 the ODBC driver which in turn has a connection to the target datasource.
91 Datasource connections can have a virtually unlimited number of wxDbTable
92 instances using the same connect (dependent on the ODBC driver). A separate
93 connection is not needed for each table (the exception is for isolating
94 commits/rollbacks on different tables from affecting more than the desired
95 table. See the class documentation on
96 \helpref{wxDb::CommitTrans}{wxdbcommittrans} and
97 \helpref{wxDb::RollbackTrans}{wxdbrollbacktrans}.}
98 \twocolitem{Rows}{Similar to records in old relational databases, a row is a
99 collection of one instance of each column of the data table that are all
100 associated with each other.}
101 \twocolitem{Columns}{Individual fields associated with each row of a data
102 table.}
103 \twocolitem{Query}{Request from the client to the datasource asking for
104 the data that matches the requirements specified in the users request. When
105 a query is performed, the datasource performs the lookup of the rows with
106 satisfy the query, and creates a result set.}
107 \twocolitem{Result set}{The data which matches the requirements specified
108 in a query sent to the datasource. Dependent on drivers, a result set
109 typically remains at the datasource (no data is transmitted to the ODBC driver)
110 until the client actually instructs the ODBC driver to retrieve it.}
111 \twocolitem{Cursor}{a logical pointer into the result set that a query
112 generates, indicating the next record that will be returned to the client
113 when a request for the next record is made.}
114 \twocolitem{Scrolling cursors}{Scrolling refers to the movement of cursors
115 through the result set. Cursors can always scroll forward sequentially in
116 the result set (FORWARD ONLY scrolling cursors). With Forward only scrolling
117 cursors, once a row in the result set has been returned to the ODBC driver
118 and on to the client, there is no way to have the cursor move backward in
119 the result set to look at the row that is previous to the current row in
120 the result set. If BACKWARD scrolling cursors are supported by both the
121 ODBC driver and the datasource that are being used, then backward
122 scrolling cursor functions may be used (
123 \helpref{wxDbTable::GetPrev}{wxdbtablegetprev},
124 \helpref{wxDbTable::GetFirst}{wxdbtablegetfirst}, and
125 \helpref{wxDbTable::GetLast}{wxdbtablegetlast}). If the datasource or the
126 ODBC driver only support forward scrolling cursors, your program and logic
127 must take this in to account.}
128 \twocolitem{Commit/Rollback}{Commit will physically save
129 insertions/deletions/updates, while rollback basically does an undo of
130 everything done against the datasource connection that has not been
131 previously committed. Note that Commit and Rollbacks are done on a
132 connection, not on individual tables. All tables which use a shared
133 connection to the datasource are all committed/rolled back at the same
134 time when a call to
135 \helpref{wxDb::CommitTrans}{wxdbcommittrans} or
136 \helpref{wxDb::RollbackTrans}{wxdbrollbacktrans} is made.}
137 \twocolitem{Index}{Indexes are datasource maintained lookup structures
138 that allow the datasource to quickly locate data rows based on the values
139 of certain columns. Without indexes, the datasource would need to do a
140 sequential search of a table every time a query request is made. Proper
141 unique key index construction can make datasource queries nearly instantaneous.}
142 \end{twocollist}
143
144 Before you are able to read data from a data table in a datasource, you must
145 have a connection to the datasource. Each datasource connection may be used
146 to open multiple tables all on the same connection (number of tables open are
147 dependent on the driver, datasource configuration and the amount of memory on
148 the client workstation). Multiple connections can be opened to the same
149 datasource by the same client (number of concurrent connections is dependent
150 on the driver and datasource configuration).
151
152 When a query is performed, the client passes the query to the ODBC driver,
153 and the driver then translates it and passes it along to the datasource. The
154 database engine (in most cases - exceptions are text and dBase files) running
155 on the machine hosting the database does all the work of performing the search
156 for the requested data. The client simply waits for a status to come back
157 through the ODBC driver from the datasource.
158
159 Depending on the ODBC driver, the result set either remains "queued" on the
160 database server side, or is transferred to the machine that the driver is
161 queued on. The client does not receive this data. The client must request
162 some or all of the result set to be returned before any data rows are
163 returned to the client application.
164
165 Result sets do not need to include all columns of every row matching the
166 query. In fact, result sets can actually be joinings of columns from two
167 or more data tables, may have derived column values, or calculated values
168 returned.
169
170 For each result set, a cursor is maintained (typically by the database)
171 which keeps track of where in the result set the user currently is.
172 Depending on the database, ODBC driver, and how you configured the
173 wxWindows ODBC settings in setup.h (see \helpref{wxODBC - Compiling}{wxodbccompiling}), cursors can be
174 either forward or backward scrolling. At a minim, cursors must scroll
175 forward. For example, if a query resulted in a result set with 100 rows,
176 as the data is read by the client application, it will read row 1, then 2,
177 then 3, etc, etc. With forward only cursors, once the cursor has moved to
178 the next row, the previous row cannot be accessed again without re-querying
179 the datasource for the result set over again. Backward scrolling cursors
180 allow you to request the previous row from the result set, actually
181 scrolling the cursor backward.
182
183 Backward scrolling cursors are not supported on all database/driver
184 combinations. For this reason, forward-only cursors are the default in
185 the wxODBC classes. If your datasource does support backward scrolling
186 cursors and you wish to use them, make the appropriate changes in setup.h
187 to enable them (see \helpref{wxODBC - Compiling}{wxodbccompiling}). For greatest portability between
188 datasources, writing your program in such a way that it only requires
189 forward scrolling cursors is your best bet. On the other hand, if you are
190 focusing on using only datasources that support backward scrolling cursors,
191 potentially large performance benefits can be gained from using them.
192
193 There is a limit to the number of cursors that can be open on each connection
194 to the datasource, and usually a maximum number of cursors for the datasource
195 itself. This is all dependent on the database. Each connection that is
196 opened (each instance of a wxDb) opens a minimum of 5 cursors for on creation
197 that are required for things such as updates/deletions/rollbacks/queries.
198 Cursors are a limited resource, so use care in creating large numbers of
199 cursors.
200
201 Additional cursors can be created if necessary with the
202 \helpref{wxDbTable::GetNewCursor}{wxdbtablegetnewcursor} function. One example
203 use for additional cursors are to track multiple scroll points in result
204 sets. By creating a new cursor, a program could request a second result set
205 from the datasource while still maintaining the original cursor position in
206 the first result set.
207
208 Different than non-SQL/ODBC datasources, when a program performs an
209 insertion, deletion, or update (or other SQL functions like altering
210 tables, etc) through ODBC, the program must issue a "commit" to the
211 datasource to tell the datasource that the action(s) it has been told to
212 perform are to be recorded as permanent. Until a commit is performed,
213 any other programs that query the datasource will not see the changes that
214 have been made (although there are databases that can be configured to
215 auto-commit). NOTE: With most all datasources, until the commit is
216 performed, any cursor that is open on that same datasource connection
217 will be able to see the changes that are uncommitted. Check your
218 database's documentation/configuration to verify this before counting on it
219 though.
220
221 A rollback is basically an UNDO command on the datasource connection. When
222 a rollback is issued, the datasource will flush all commands it has been told
223 to do since the last commit that was performed.
224
225 NOTE: Commits/Rollbacks are done on datasource connections (wxDb instances)
226 not on the wxDbTable instances. This means that if more than one table
227 shares the same connection, and a commit or rollback is done on that
228 connection, all pending changes for ALL tables using that connection are
229 committed/rolled back.
230
231
232
233 \subsection{wxODBC - Configuring your system for ODBC use}\label{wxodbcconfiguringyoursystem}
234
235 Before you are able to access a datasource, you must have installed and
236 configured an ODBC driver. Doing this is system specific, so it will not be
237 covered in detail here. But here are a few details to get you started.
238
239 Most database vendors provide at least a minimal ODBC driver with their
240 database product. In practice, many of these drivers have proven to be slow
241 and/or incomplete. Rumor has it that this is because the vendors do not want
242 you using the ODBC interface to their products, they want you to use their
243 applications to access the data.
244
245 Whatever the reason, for database intensive applications, you may want to
246 think of using a third-party ODBC driver for your needs. One example of a
247 third party set of ODBC drivers that has been heavily tested and used is
248 Rogue Wave's drivers. Rogue Wave has drivers available for many different
249 platforms and databases.
250
251 Under Microsoft Windows, install the ODBC driver you are planning to use. You
252 will then use the ODBC Administrator in the Control Panel to configure an
253 instance of the driver for your intended datasource. Note that with all
254 flavors of NT, this configuration can be set up as a System or User DSN
255 (datasource name). Configuring it as a system resource will make it
256 available to all users (if you are logged in as 'administrator'), otherwise
257 the datasource will only be available to the who configured the DSN.
258
259 Under Unix, iODBC is used for implementation of the ODBC API. To compile the
260 wxODBC classes, you must first obtain (http://www.iodbc.org) and install iODBC.
261 Then you must create the file "~/.odbc.ini" (or optionally create
262 "/etc/odbc.ini" for access for all users on the system). This file contains
263 the settings for your system/datasource. Below is an example section of a
264 odbc.ini file for use with the "samples/db" sample program using MySQL:
265
266 \begin{verbatim}
267 [contacts]
268 Trace = Off
269 TraceFile= stderr
270 Driver = /usr/local/lib/libmyodbc.so
271 DSN = contacts
272 SERVER = 192.168.1.13
273 USER = qet
274 PASSWORD =
275 PORT = 3306
276 \end{verbatim}
277
278
279
280 \subsection{wxODBC - Compiling}\label{wxodbccompiling}
281
282 The wxWindows setup.h file has several settings in it pertaining to compiling
283 the wxODBC classes.
284
285 \begin{twocollist}\itemsep=0pt
286 \twocolitem{wxUSE_ODBC}{This must be set to 1 in order for the compiler to
287 compile the wxODBC classes. Without setting this to 1, there will be no
288 access to any of the wxODBC classes. The default is 0.}
289 \twocolitem{wxODBC_FWD_ONLY_CURSORS}{When a new database connection is
290 requested, this setting controls the default of whether the connection allows
291 only forward scrolling cursors, or forward and backward scrolling cursors
292 (see the section in "WHERE TO START" on cursors for more information on
293 cursors). This default can be overridden by passing a second parameter to
294 either the \helpref{wxDbGetConnection}{wxdbfunctions} or
295 \helpref{wxDb constructor}{wxdbconstr}. The default is 1.}
296 \twocolitem{wxODBC_BACKWARD_COMPATABILITY}{Between v2.0 and 2.2, massive
297 renaming efforts were done to the ODBC classes to get naming conventions
298 similar to those used throughout wxWindows, as well as to preface all wxODBC
299 classes names and functions with a wxDb preface. Because this renaming would
300 affect applications written using the v2.0 names, this compile-time directive
301 was added to allow those programs written for v2.0 to still compile using the
302 old naming conventions. These deprecated names are all #define'd to their
303 corresponding new function names at the end of the db.cpp/dbtable.cpp source
304 files. These deprecated class/function names should not be used in future
305 development, as at some point in the future they will be removed. The default
306 is 0.}
307 \end{twocollist}
308
309 {\it Under MS Windows}
310
311 You are required to include the "odbc32.lib" provided by your compiler vendor
312 in the list of external libraries to be linked in. If using the makefiles
313 supplied with wxWindows, this library should already be included for use with
314 makefile.b32, makefile.vc, and makefile.g95.
315
316 You cannot compile the wxODBC classes under Win16 - sorry.
317
318 \normalbox{MORE TO COME}
319
320 {\it Under Unix}
321 --with-iodbc flag for configure
322
323 \normalbox{MORE TO COME}
324
325
326
327 \subsection{wxODBC - Basic Step-By-Step Guide}\label{wxodbcstepbystep}
328
329 To use the classes in an application, there are eight basic steps:
330
331 \begin{itemize}\itemsep=0pt
332 \item Define datasource connection information
333 \item Get a datasource connection
334 \item Create table definition
335 \item Open the table
336 \item Use the table
337 \item Close the table
338 \item Close the datasource connection
339 \item Release the ODBC environment handle
340 \end{itemize}
341
342 Following each of these steps is detailed to explain the step, and to
343 hopefully mention as many of the pitfalls that beginning users fall in
344 to when first starting to use the classes. Throughout the steps, small
345 snippets of code are shown to show the syntax of performing the step. A
346 complete code snippet is provided at the end of this overview that shows a
347 complete working flow of all these steps (see
348 \helpref{wxODBC - Sample Code #1}{wxodbcsamplecode1}).
349
350
351 {\bf Define datasource connection information}
352
353 To be able to connect to a datasource through the ODBC driver, a program must
354 supply a minimum of three pieces of information: Datasource name, User ID, and
355 Authorization string (password). A fourth piece of information, a default
356 directory indicating where the data file is stored, is required for Text and
357 dBase drivers for ODBC.
358
359 The wxWindows data class wxDbConnectInf exists for holding all of these
360 values, plus some others that may be desired.
361
362 The 'Henv' member is the environment handle used to access memory for use by the
363 ODBC driver. Use of this member is described below in the "Getting a Connection
364 to the Datasource" section.
365
366 The 'Dsn' must exactly match the datasource name used to configure the ODBC
367 datasource (in the ODBC Administrator (MSW only) or in the .odbc.ini file).
368
369 The 'Uid' is the User ID that is to be used to log in to the datasource. This
370 User ID must already have been created and assigned rights within the
371 datasource to which you are connecting. The user that the connection is
372 establish by will determine what rights and privileges the datasource
373 connection will allow the program to have when using the connection that
374 this connection information was used to establish. Some datasources are
375 case sensitive for User IDs, and though the wxODBC classes attempt to hide
376 this from you by manipulating whatever data you pass in to match the
377 datasource's needs, it is always best to pass the 'Uid' in the case that
378 the datasource requires.
379
380 The 'AuthStr' is the password for the User ID specified in the 'Uid' member.
381 As with the 'Uid', some datasources are case sensitive (in fact most are).
382 The wxODBC classes do NOT try to manage the case of the 'AuthStr' at all.
383 It is passed verbatim to the datasource, so you must use the case that the
384 datasource is expecting.
385
386 The 'defaultDir' member is used with file based datasources (i.e. dBase,
387 FoxPro, text files). It contains a full path to the location where the
388 data table or file is located. When setting this value, use forward
389 slashes '/' rather than backslashes '\' to avoid compatibility differences
390 between ODBC drivers.
391
392 The other fields are currently unused. The intent of these fields are that
393 they will be used to write our own ODBC Administrator type program that will
394 work on both MSW and Un*x systems, regardless of the datasource. Very little
395 work has been done on this to date.
396
397
398 {\bf Get a Datasource Connection}
399
400 There are two methods of establishing a connection to a datasource. You
401 may either manually create your own wxDb instance and open the connection,
402 or you may use the caching functions provided with the wxODBC classes to
403 create/maintain/delete the connections.
404
405 Regardless of which method you use, you must first have a fully populated
406 wxDbConnectInf object. In the wxDbConnectInf instance, provide a valid
407 Dns, Uid, and AuthStr (along with a 'defaultDir' if necessary). Before
408 using this though, you must allocate an environment handle to the 'Henv'
409 member.
410
411 \begin{verbatim}
412 wxDbConnectInf DbConnectInf;
413 DbConnectInf.SetDsn,"MyDSN");
414 DbConnectInf.SetUserID,"MyUserName");
415 DbConnectInf.SetPassword("MyPassword");
416 DbConnectInf.SetDefaultDir("");
417 \end{verbatim}
418
419 To allocate an environment handle for the ODBC connection to use, the
420 wxDbConnectInf class has a datasource independent method for creating
421 the necessary handle:
422
423 \begin{verbatim}
424 if (DbConnectInf.AllocHenv())
425 {
426 wxMessageBox("Unable to allocate an ODBC environment handle",
427 "DB CONNECTION ERROR", wxOK | wxICON_EXCLAMATION);
428 return;
429 }
430 \end{verbatim}
431
432 When the wxDbConnectInf::AllocHenv() function is called successfully, a
433 value of TRUE will be returned. A value of FALSE means allocation failed,
434 and the handle will be undefined.
435
436 A shorter form of doing the above steps is encapsulated into the
437 long form of the constructor for wxDbConnectInf.
438
439 \begin{verbatim}
440 wxDbConnectInf *DbConnectInf;
441
442 DbConnectInf = new wxDbConnectInf(NULL, "MyDSN", "MyUserName",
443 "MyPassword", "");
444 \end{verbatim}
445
446 This shorthand form of initializing the constructor passes a NULL for the SQL
447 environment handle, telling the constructor to allocate a handle during
448 construction. This handle is also managed for the life of wxDbConnectInf
449 instance, and is freed automatically upon destruction of the instance.
450
451 Once the wxDbConnectInf instance is initialized, you are ready to
452 connect to the datasource.
453
454 To manually create datasource connections, you must create a wxDb
455 instance, and then open it.
456
457 \begin{verbatim}
458 wxDb *db = new wxDb(DbConnectInf->GetHenv());
459
460 opened = db->Open(DbConnectInf);
461 \end{verbatim}
462
463 The first line does the house keeping needed to initialize all
464 the members of the wxDb class. The second line actually sends the request
465 to the ODBC driver to open a connection to its associated datasource using
466 the parameters supplied in the call to \helpref{wxDb::Open}{wxdbopen}.
467
468 A more advanced form of opening a connection is to used the connection
469 caching functions that are included with the wxODBC classes. The caching
470 mechanisms do the same functions are the manual approach to opening a
471 connection, but they also manage each connection they have created,
472 re-using them and cleaning them up when they are closed, without you
473 programmatically needing to do the coding.
474
475 To use the caching function \helpref{wxDbGetConnection}{wxdbfunctions} to get
476 a connection to a datasource, simply call it with a single parameter of the
477 type wxDbConnectInf:
478
479 \begin{verbatim}
480 db = wxDbGetConnection(DbConnectInf);
481 \end{verbatim}
482
483 The wxDb pointer that is returned is both initialized and opened. If
484 something failed in creating or opening the connection, the return value
485 from \helpref{wxDbGetConnection}{wxdbfunctions} will be NULL.
486
487 The connection that is returned is either a new connection, or it is a
488 "free" connection from the cache of connections that the class maintains
489 that was no longer in use. Any wxDb instance created with a call to
490 \helpref{wxDbGetConnection}{wxdbfunctions} is kept track of in a linked list of established
491 connections. When a program is done with a connection, a call to
492 \helpref{wxDbFreeConnection}{wxdbfunctions} is made, and the datasource
493 connection will then be tagged as FREE, making it available for the next
494 call to \helpref{wxDbGetConnection}{wxdbfunctions} that needs a connection
495 using the same connection information (Dsn, Uid, AuthStr). The cached
496 connections remain cached until a call to \helpref{wxDbCloseConnections}{wxdbfunctions} is made,
497 at which time all cached connections are closed and deleted.
498
499 Besides the obvious advantage of using the single command caching routine to
500 obtain a datasource connection, using cached connections can be quite a
501 performance boost as well. Each time that a new connection is created
502 (not retrieved from the cache of free connections), the wxODBC classes
503 perform many queries against the datasource to determine the datasource's
504 datatypes and other fundamental behaviors. Depending on the hardware,
505 network bandwidth, and datasource speed, this can in some cases take a
506 few seconds to establish the new connection (with well balanced systems,
507 it should only be a fraction of a second). Re-using already established
508 datasource connections rather than creating/deleting, creating/deleting
509 connections can be quite a time saver.
510
511 Another time saver is the "copy connection" features of both
512 \helpref{wxDb::Open}{wxdbopen} and \helpref{wxDbGetConnection}{wxdbfunctions}.
513 If manually creating a wxDb instance and opening it, you must pass an existing
514 connection to the \helpref{wxDb::Open}{wxdbopen} function yourself to gain the performance
515 benefit of copying existing connection settings. The
516 \helpref{wxDbGetConnection}{wxdbfunctions} function automatically does this
517 for you, checking the Dsn, Uid, and AuthStr parameters when you request
518 a connection for any existing connections that use those same settings.
519 If one is found, \helpref{wxDbGetConnection}{wxdbfunctions} copies the datasource settings for
520 datatypes and other datasource specific information that was previously
521 queried, rather than re-querying the datasource for all those same settings.
522
523 One final note on creating a connection. When a connection is created, it
524 will default to only allowing cursor scrolling to be either forward only,
525 or both backward and forward scrolling cursors. The default behavior is
526 determined by the setting "wxODBC_FWD_ONLY_CURSORS" in setup.h when you
527 compile the wxWindows library. The library default is to only support
528 forward scrolling cursors only, though this can be overridden by parameters
529 for wxDb() constructor or the \helpref{wxDbGetConnection}{wxdbfunctions}
530 function. All datasources and ODBC drivers must support forward scrolling
531 cursors. Many datasources support backward scrolling cursors, and many
532 ODBC drivers support backward scrolling cursors. Before planning on using
533 backward scrolling cursors, you must be certain that both your datasource
534 and ODBC driver fully support backward scrolling cursors. See the small
535 blurb about "Scrolling cursors" in the definitions at the beginning of
536 this overview, or other details of setting the cursor behavior in the wxDb
537 class documentation.
538
539
540 {\bf Create Table Definition}
541
542 Data can be accessed in a datasource's tables directly through various
543 functions of the wxDb class (see \helpref{wxDb::GetData}{wxdbgetdata}). But to make life much
544 simpler, the wxDbTable class encapsulates all of the SQL specific API calls
545 that would be necessary to do this, wrapping it in an intuitive class of APIs.
546
547 The first step in accessing data in a datasource's tables via the wxDbTable
548 class is to create a wxDbTable instance.
549
550 \begin{verbatim}
551 table = new wxDbTable(db, tableName, numTableColumns, "",
552 !wxDB_QUERY_ONLY, "");
553 \end{verbatim}
554
555 When you create the instance, you indicate the previously established
556 datasource connection to be used to access the table, the name of the
557 primary table that is to be accessed with the datasource's tables, how many
558 columns of each row are going to be returned, the name of the view of the
559 table that will actually be used to query against (works with Oracle only
560 at this time), whether the data returned is for query purposes only, and
561 finally the path to the table, if different than the path specified when
562 connecting to the datasource.
563
564 Each of the above parameters are described in detail in the wxDbTable
565 class' description, but one special note here about the fifth
566 parameter - queryOnly setting. If a wxDbTable instance is created as
567 wxDB_QUERY_ONLY, then no inserts/deletes/updates are able to be performed
568 using this instance of the wxDbTable. Any calls to \helpref{wxDb::CommitTrans}{wxdbcommittrans}
569 or \helpref{wxDb::RollbackTrans}{wxdbrollbacktrans} against the datasource
570 connection used by this wxDbTable instance are ignored by this instance. If
571 the wxDbTable instance is created with "!wxDB_QUERY_ONLY" as shown above,
572 then all the cursors and other overhead associated with being able to
573 insert/update/delete data in the table are created, and thereby those
574 operations can then be performed against the associated table with this
575 wxDbTable instance.
576
577 If a table is to be accessed via a wxDbTable instance, and the table will
578 only be read from, not written to, there is a performance benefit (not as
579 many cursors need to be maintained/updated, hence speeding up access times),
580 as well as a resource savings due to fewer cursors being created for the
581 wxDbTable instance. Also, with some datasources, the number of
582 simultaneous cursors is limited.
583
584 When defining the columns to be retrievable by the wxDbTable instance, you
585 can specify anywhere from one column up to all columns in the table.
586
587 \begin{verbatim}
588 table->SetColDefs(0, "FIRST_NAME", DB_DATA_TYPE_VARCHAR, FirstName,
589 SQL_C_CHAR, sizeof(name), TRUE, TRUE);
590 table->SetColDefs(1, "LAST_NAME", DB_DATA_TYPE_VARCHAR, LastName,
591 SQL_C_CHAR, sizeof(LastName), TRUE, TRUE);
592 \end{verbatim}
593
594 Notice that column definitions start at index 0 and go up to one less than
595 the number of columns specified when the wxDbTable instance was created
596 (in this example, two columns - one with index 0, one with index 1).
597
598 The above lines of code "bind" the datasource columns specified to the
599 memory variables in the client application. So when the application
600 makes a call to \helpref{wxDbTable::GetNext}{wxdbtablegetnext} (or any other function that retrieves
601 data from the result set), the variables that are bound to the columns will
602 have the column value stored into them. See the
603 \helpref{wxDbTable::SetColDefs}{wxdbtablesetcoldefs}
604 class documentation for more details on all the parameters for this function.
605
606 The bound memory variables have undefined data in them until a call to a
607 function that retrieves data from a result set is made
608 (e.g. \helpref{wxDbTable::GetNext}{wxdbtablegetnext},
609 \helpref{wxDbTable::GetPrev}{wxdbtablegetprev}, etc). The variables are not
610 initialized to any data by the wxODBC classes, and they still contain
611 undefined data after a call to \helpref{wxDbTable::Query}{wxdbtablequery}. Only
612 after a successful call to one of the ::GetXxxx() functions is made do the
613 variables contain valid data.
614
615 It is not necessary to define column definitions for columns whose data is
616 not going to be returned to the client. For example, if you want to query
617 the datasource for all users with a first name of 'GEORGE', but you only want
618 the list of last names associated with those rows (why return the FIRST_NAME
619 column every time when you already know it is 'GEORGE'), you would only have
620 needed to define one column above.
621
622 You may have as many wxDbTable instances accessing the same table using the
623 same wxDb instance as you desire. There is no limit imposed by the classes
624 on this. All datasources supported (so far) also have no limitations on this.
625
626
627 {\bf Open the table}
628
629 Opening the table technically is not doing anything with the datasource
630 itself. Calling \helpref{wxDbTable::Open}{wxdbtableopen} simply does all the
631 house keeping of checking that the specified table exists, that the current
632 connected user has at least SELECT privileges for accessing the table,
633 setting up the requisite cursors, binding columns and cursors, and
634 constructing the default INSERT statement that is used when a new row is
635 inserted into the table (non-wxDB_QUERY_ONLY tables only).
636
637 \begin{verbatim}
638 if (!table->Open())
639 {
640 // An error occurred opening (setting up) the table
641 }
642 \end{verbatim}
643
644 The only reason that a call to \helpref{wxDbTable::Open}{wxdbtableopen} will likely fail is if the
645 user has insufficient privileges to even SELECT the table. Other problems
646 could occur, such as being unable to bind columns, but these other reason
647 point to some lack of resource (like memory). Any errors generated
648 internally in the \helpref{wxDbTable::Open}{wxdbtableopen} function are logged to the error log
649 if SQL logging is turned on for the classes.
650
651
652 {\bf Use the table}
653
654 To use the table and the definitions that are now set up, we must first
655 define what data we want the datasource to collect in to a result set, tell
656 it where to get the data from, and in what sequence we want the data returned.
657
658 \begin{verbatim}
659 // the WHERE clause limits/specifies which rows in the table
660 // are to be returned in the result set
661 table->SetWhereClause("FIRST_NAME = 'GEORGE'");
662
663 // Result set will be sorted in ascending alphabetical
664 // order on the data in the 'LAST_NAME' column of each row
665 // If the same last name is in the table for two rows,
666 // sub-sort on the 'AGE' column
667 table->SetOrderByClause("LAST_NAME, AGE");
668
669 // No other tables (joins) are used for this query
670 table->SetFromClause("");
671 \end{verbatim}
672
673 The above lines will be used to tell the datasource to return in the result
674 all the rows in the table whose column "FIRST_NAME" contains the name
675 'GEORGE' (note the required use of the single quote around the string
676 literal) and that the result set will return the rows sorted by ascending
677 last names (ascending is the default, and can be overridden with the
678 "DESC" keyword for datasources that support it - "LAST_NAME DESC").
679
680 Specifying a blank WHERE clause will result in the result set containing
681 all rows in the datasource.
682
683 Specifying a blank ORDERBY clause means that the datasource will return
684 the result set in whatever sequence it encounters rows which match the
685 selection criteria. What this sequence is can be hard to determine.
686 Typically it depends on the index that the datasource used to find the
687 rows which match the WHERE criteria. BEWARE - relying on the datasource
688 to return data in a certain sequence when you have not provided an ORDERBY
689 clause will eventually cause a problem for your program. Databases can be
690 tuned to be COST-based, SPEED-based, or some other basis for how it gets
691 your result set. In short, if you need your result set returned in a
692 specific sequence, ask for it that way by providing an ORDERBY clause.
693
694 Using an ORDERBY clause can be a performance hit, as the database must
695 sort the items before making the result set available to the client.
696 Creating efficient indexes that cause the data to be "found" in the correct
697 ORDERBY sequence can be a big performance benefit. Also, in the large
698 majority of cases, the database will be able to sort the records faster
699 than your application can read all the records in (unsorted) and then sort
700 them. Let the database do the work for you!
701
702 Notice in the example above, a column that is not included in the bound
703 data columns ('AGE') will be used to sub-sort the result set.
704
705 The FROM clause in this example is blanked, as we are not going to be
706 performing any table joins with this simple query. When the FROM clause
707 is blank, it is assumed that all columns referenced are coming from
708 the default table for the wxDbTable instance.
709
710 After the selection criteria have been specified, the program can now
711 ask the datasource to perform the search and create a result set that
712 can be retrieved:
713
714 \begin{verbatim}
715 // Instruct the datasource to perform a query based on the
716 // criteria specified above in the where/orderBy/from clauses.
717 if (!table->Query())
718 {
719 // An error occurred performing the query
720 }
721 \end{verbatim}
722
723 Typically, when an error occurs when calling \helpref{wxDbTable::Query}{wxdbtablequery}, it is a
724 syntax problem in the WHERE clause that was specified. The exact SQL
725 (datasource specific) reason for what caused the failure of \helpref{wxDbTable::Query}{wxdbtablequery}
726 (and all other operations against the datasource can be found by
727 parsing the table's database connection's "errorList[]" array member for
728 the stored text of the error.
729
730 When the \helpref{wxDbTable::Query}{wxdbtablequery} returns TRUE, the
731 database was able to successfully complete the requested query using the
732 provided criteria. This does not mean that there are any rows in the
733 result set, it just mean that the query was successful.
734
735 \normalbox{IMPORTANT: The result created by the call to
736 \helpref{wxDbTable::Query}{wxdbtablequery} can be one of two forms. It is
737 either a snapshot of the data at the exact moment that the database
738 determined the record matched the search criteria, or it is a pointer to
739 the row that matched the selection criteria. Which form of behavior is
740 datasource dependent. If it is a snapshot, the data may have changed
741 since the result set was constructed, so beware if your datasource
742 uses snapshots and call \helpref{wxDbTable::Refresh}{wxdbtablerefresh}. Most larger brand databases
743 do not use snapshots, but it is important to mention so that your application
744 can handle it properly if your datasource does. }
745
746 To retrieve the data, one of the data fetching routines must be used to
747 request a row from the result set, and to store the data from the result
748 set into the bound memory variables. After \helpref{wxDbTable::Query}{wxdbtablequery}
749 has completed successfully, the default/current cursor is placed so it
750 is pointing just before the first record in the result set. If the
751 result set is empty (no rows matched the criteria), then any calls to
752 retrieve data from the result set will return FALSE.
753
754 \begin{verbatim}
755 wxString msg;
756
757 while (table->GetNext())
758 {
759 msg.Printf("Row #%lu -- First Name : %s Last Name is %s",
760 table->GetRowNum(), FirstName, LastName);
761 wxMessageBox(msg, "Data", wxOK | wxICON_INFORMATION, NULL);
762 }
763 \end{verbatim}
764
765 The sample code above will read the next record in the result set repeatedly
766 until the end of the result set has been reached. The first time that
767 \helpref{wxDbTable::GetNext}{wxdbtablegetnext} is called right after the successful
768 call to \helpref{wxDbTable::Query}{wxdbtablequery}, it actually returns the first record
769 in the result set.
770
771 When \helpref{wxDbTable::GetNext}{wxdbtablegetnext} is called and there are
772 no rows remaining in the result set after the current cursor position,
773 \helpref{wxDbTable::GetNext}{wxdbtablegetnext} (as well as all the other
774 wxDbTable::GetXxxxx() functions) will return FALSE.
775
776
777 {\bf Close the table}
778
779 When the program is done using a wxDbTable instance, it is as simple as
780 deleting the table pointer (or if declared statically, letting the
781 variable go out of scope). Typically the default destructor will take
782 care of all that is required for cleaning up the wxDbTable instance.
783
784 \begin{verbatim}
785 if (table)
786 {
787 delete table;
788 table = NULL;
789 }
790 \end{verbatim}
791
792 Deleting a wxDbTable instance releases all of its cursors, deletes the
793 column definitions and frees the SQL environment handles used by the
794 table (but not the environment handle used by the datasource connection
795 that the wxDbTable instance was using).
796
797
798
799 {\bf Close the datasource connection}
800
801 After all tables that have been using a datasource connection have been
802 closed (this can be checked by calling \helpref{wxDb::GetTableCount}{wxdbgettablecount}
803 and checking that it returns 0), then you may close the datasource
804 connection. The method of doing this is dependent on whether the
805 non-caching or caching method was used to obtain the datasource connection.
806
807 If the datasource connection was created manually (non-cached), closing the
808 connection is done like this:
809
810 \begin{verbatim}
811 if (db)
812 {
813 db->Close();
814 delete db;
815 db = NULL;
816 }
817 \end{verbatim}
818
819 If the program used the \helpref{wxDbGetConnection}{wxdbfunctions} function to get a datasource
820 connection, the following is the code that should be used to free the
821 connection(s):
822
823 \begin{verbatim}
824 if (db)
825 {
826 wxDbFreeConnection(db);
827 db = NULL;
828 }
829 \end{verbatim}
830
831 Note that the above code just frees the connection so that it can be
832 re-used on the next call the \helpref{wxDbGetConnection}{wxdbfunctions}. To actually dispose
833 of the connection, releasing all of its resources (other than the
834 environment handle), do the following:
835
836 \begin{verbatim}
837 wxDbCloseConnections();
838 \end{verbatim}
839
840
841 {\bf Release the ODBC environment handle}
842
843 Once all of the connections that used the ODBC environment handle (in
844 this example it was stored in "DbConnectInf.Henv") have been closed, then
845 it is safe to release the environment handle:
846
847 \begin{verbatim}
848 DbConnectInf->FreeHenv());
849 \end{verbatim}
850
851 Or, if the long form of the constructor was used and the constructor was allowed
852 to allocate its own SQL environment handle, leaving scope or destruction of the
853 wxDbConnectInf will free the handle automatically.
854
855 \begin{verbatim}
856 delete DbConnectInf;
857 \end{verbatim}
858
859 \normalbox{Remember to never release this environment handle if there are any
860 connections still using the handle.
861 }
862
863
864 \subsection{wxODBC - Known Issues}\label{wxodbcknownissues}
865
866 As with creating wxWindows, writing the wxODBC classes was not the simple
867 task of writing an application to run on a single type of computer system.
868 The classes need to be cross-platform for different operating systems, and
869 they also needed to take in to account different database manufacturers and
870 different ODBC driver manufacturers. Because of all the possible combinations
871 of OS/database/drivers, it is impossible to say that these classes will work
872 perfectly with datasource ABC, ODBC driver XYZ, on platform LMN. You may run
873 in to some incompatibilities or unsupported features when moving your
874 application from one environment to another. But that is what makes
875 cross-platform programming fun. It is also pinpoints one of the great
876 things about open source software. It can evolve!
877
878 The most common difference between different database/ODBC driver
879 manufacturers in regards to these wxODBC classes is the lack of
880 standard error codes being returned to the calling program. Sometimes
881 manufacturers have even changed the error codes between versions of
882 their databases/drivers.
883
884 In all the tested databases, every effort has been made to determine
885 the correct error codes and handle them in the class members that need
886 to check for specific error codes (such as TABLE DOES NOT EXIST when
887 you try to open a table that has not been created yet). Adding support
888 for additional databases in the future requires adding an entry for the
889 database in the \helpref{wxDb::Dbms}{wxdbdbms} function, and then handling any error codes
890 returned by the datasource that do not match the expected values.
891
892
893 {\bf Databases}
894
895 Following is a list of known issues and incompatibilities that the
896 wxODBC classes have between different datasources. An up to date
897 listing of known issues can be seen in the comments of the source
898 for \helpref{wxDb::Dbms}{wxdbdbms}.
899
900 {\it ORACLE}
901 \begin{itemize}\itemsep=0pt
902 \item Currently the only database supported by the wxODBC classes to support VIEWS
903 \end{itemize}
904
905 {\it DBASE}
906
907 NOTE: dBase is not a true ODBC datasource. You only have access to as much
908 functionality as the driver can emulate.
909
910 \begin{itemize}\itemsep=0pt
911 \item Does not support the SQL_TIMESTAMP structure
912 \item Supports only one cursor and one connect (apparently? with Microsoft driver only?)
913 \item Does not automatically create the primary index if the 'keyField' param of SetColDef is TRUE. The user must create ALL indexes from their program with calls to \helpref{wxDbTable::CreateIndex}{wxdbtablecreateindex}
914 \item Table names can only be 8 characters long
915 \item Column names can only be 10 characters long
916 \item Currently cannot CREATE a dBase table - bug or limitation of the drivers used??
917 \item Currently cannot insert rows that have integer columns - bug??
918 \end{itemize}
919
920 {\it SYBASE (all)}
921 \begin{itemize}\itemsep=0pt
922 \item To lock a record during QUERY functions, the reserved word 'HOLDLOCK' must be added after every table name involved in the query/join if that table's matching record(s) are to be locked
923 \item Ignores the keywords 'FOR UPDATE'. Use the HOLDLOCK functionality described above
924 \end{itemize}
925
926 {\it SYBASE (Enterprise)}
927 \begin{itemize}\itemsep=0pt
928 \item If a column is part of the Primary Key, the column cannot be NULL
929 \item Maximum row size is somewhere in the neighborhood of 1920 bytes
930 \end{itemize}
931
932 {\it MY_SQL}
933 \begin{itemize}\itemsep=0pt
934 \item If a column is part of the Primary Key, the column cannot be NULL.
935 \item Cannot support selecting for update [\helpref{wxDbTable::CanSelectForUpdate}{wxdbtablecanselectforupdate}]. Always returns FALSE.
936 \item Columns that are part of primary or secondary keys must be defined as being NOT NULL when they are created. Some code is added in \helpref{wxDbTable::CreateIndex}{wxdbtablecreateindex} to try to adjust the column definition if it is not defined correctly, but it is experimental (as of wxWindows v2.2.1)
937 \item Does not support sub-queries in SQL statements
938 \end{itemize}
939
940 {\it POSTGRES}
941 \begin{itemize}\itemsep=0pt
942 \item Does not support the keywords 'ASC' or 'DESC' as of release v6.5.0
943 \item Does not support sub-queries in SQL statements
944 \end{itemize}
945
946 {\it DB2}
947 \begin{itemize}\itemsep=0pt
948 \item Columns which are part of a primary key must be declared as NOT NULL
949 \end{itemize}
950
951
952 {\bf UNICODE with wxODBC classes}
953
954 Currently there is no support for Unicode with the wxODBC classes. In
955 fact, Unicode builds must be disabled if wxWindows is compiled with
956 wxUSE_ODBC set to 1 in setup.h
957
958
959 \subsection{wxODBC - Sample Code #1}\label{wxodbcsamplecode1}
960
961 Simplest example of establishing/opening a connection to an ODBC datasource,
962 binding variables to the columns for read/write usage, opening an
963 existing table in the datasource, setting the query parameters
964 (where/orderBy/from), querying the datasource, reading each row of the
965 result set, then cleaning up.
966
967 NOTE: Not all error trapping is shown here, to reduce the size of the
968 code and to make it more easily readable.
969
970 \begin{verbatim}
971 wxDbConnectInf *DbConnectInf = NULL;
972
973 wxDb *db = NULL; // The database connection
974 wxDbTable *table = NULL; // The data table to access
975
976 wxChar FirstName[50+1]; // buffer for data from column "FIRST_NAME"
977 wxChar LastName[50+1]; // buffer for data from column "LAST_NAME"
978
979 bool errorOccured = FALSE;
980
981 const wxChar tableName[] = "CONTACTS";
982 const int numTableColumns = 2; // Number of bound columns
983
984 FirstName[0] = 0;
985 LastName[0] = 0;
986
987 DbConnectInf = new wxDbConnectInf(NULL,"MyDSN","MyUserName", "MyPassword");
988
989 if (!DbConnectInf || !DbConnectInf->GetHenv())
990 {
991 wxMessageBox("Unable to allocate an ODBC environment handle",
992 "DB CONNECTION ERROR", wxOK | wxICON_EXCLAMATION);
993 return;
994 }
995
996 // Get a database connection from the cached connections
997 db = wxDbGetConnection(DbConnectInf);
998
999 // Create the table connection
1000 table = new wxDbTable(db, tableName, numTableColumns, "",
1001 !wxDB_QUERY_ONLY, "");
1002
1003 //
1004 // Bind the columns that you wish to retrieve. Note that there must be
1005 // 'numTableColumns' calls to SetColDefs(), to match the wxDbTable definition
1006 //
1007 // Not all columns need to be bound, only columns whose values are to be
1008 // returned back to the client.
1009 //
1010 table->SetColDefs(0, "FIRST_NAME", DB_DATA_TYPE_VARCHAR, FirstName,
1011 SQL_C_CHAR, sizeof(name), TRUE, TRUE);
1012 table->SetColDefs(1, "LAST_NAME", DB_DATA_TYPE_VARCHAR, LastName,
1013 SQL_C_CHAR, sizeof(LastName), TRUE, TRUE);
1014
1015 // Open the table for access
1016 table->Open();
1017
1018 // Set the WHERE clause to limit the result set to only
1019 // return all rows that have a value of 'GEORGE' in the
1020 // FIRST_NAME column of the table.
1021 table->SetWhereClause("FIRST_NAME = 'GEORGE'");
1022
1023 // Result set will be sorted in ascending alphabetical
1024 // order on the data in the 'LAST_NAME' column of each row
1025 table->SetOrderByClause("LAST_NAME");
1026
1027 // No other tables (joins) are used for this query
1028 table->SetFromClause("");
1029
1030 // Instruct the datasource to perform a query based on the
1031 // criteria specified above in the where/orderBy/from clauses.
1032 if (!table->Query())
1033 {
1034 wxMessageBox("Error on Query()","ERROR!",
1035 wxOK | wxICON_EXCLAMATION);
1036 errorOccured = TRUE;
1037 }
1038
1039 wxString msg;
1040
1041 // Start and continue reading every record in the table
1042 // displaying info about each record read.
1043 while (table->GetNext())
1044 {
1045 msg.Printf("Row #%lu -- First Name : %s Last Name is %s",
1046 table->GetRowNum(), FirstName, LastName);
1047 wxMessageBox(msg, "Data", wxOK | wxICON_INFORMATION, NULL);
1048 }
1049
1050 // If the wxDbTable instance was successfully created
1051 // then delete it as I am done with it now.
1052 if (table)
1053 {
1054 delete table;
1055 table = NULL;
1056 }
1057
1058 // If we have a valid wxDb instance, then free the connection
1059 // (meaning release it back in to the cache of datasource
1060 // connections) for the next time a call to wxDbGetConnection()
1061 // is made.
1062 if (db)
1063 {
1064 wxDbFreeConnection(db);
1065 db = NULL;
1066 }
1067
1068 // The program is now ending, so we need to close
1069 // any cached connections that are still being
1070 // maintained.
1071 wxDbCloseConnections();
1072
1073 // Release the environment handle that was created
1074 // for use with the ODBC datasource connections
1075 delete DbConnectInf;
1076
1077 \end{verbatim}
1078
1079
1080 \subsection{wxDatabase ODBC class overview [DEPRECATED]}\label{wxodbcoverview}
1081
1082 Classes: \helpref{wxDatabase}{wxdatabase}, \helpref{wxRecordSet}{wxrecordset}, \helpref{wxQueryCol}{wxquerycol},
1083 \rtfsp\helpref{wxQueryField}{wxqueryfield}
1084
1085 \normalboxd{The more sophisticated wxODBC classes (wxDb/wxDbTable) are the
1086 recommended classes for doing database/ODBC work with wxWindows. These new
1087 classes replace the wxWindows v1.6x classes wxDatabase.
1088
1089 Documentation for the old wxDatabase class and its associated classes is still
1090 included in the class documentation and in this overview section, but support
1091 for these old classes has been phased out, and all future development work
1092 is being done solely on the new wxDb/wxDbTable classes.}
1093
1094 wxWindows provides a set of classes for accessing a subset of Microsoft's ODBC (Open Database Connectivity)
1095 product. Currently, this wrapper is available under MS Windows only, although
1096 ODBC may appear on other platforms, and a generic or product-specific SQL emulator for the ODBC
1097 classes may be provided in wxWindows at a later date.
1098
1099 ODBC presents a unified API (Application Programmer's Interface) to a
1100 wide variety of databases, by interfacing indirectly to each database or
1101 file via an ODBC driver. The language for most of the database
1102 operations is SQL, so you need to learn a small amount of SQL as well as
1103 the wxWindows ODBC wrapper API. Even though the databases may not be
1104 SQL-based, the ODBC drivers translate SQL into appropriate operations
1105 for the database or file: even text files have rudimentary ODBC support,
1106 along with dBASE, Access, Excel and other file formats.
1107
1108 The run-time files for ODBC are bundled with many existing database
1109 packages, including MS Office. The required header files, sql.h and
1110 sqlext.h, are bundled with several compilers including MS VC++ and
1111 Watcom C++. The only other way to obtain these header files is from the
1112 ODBC SDK, which is only available with the MS Developer Network CD-ROMs
1113 -- at great expense. If you have odbc.dll, you can make the required
1114 import library odbc.lib using the tool `implib'. You need to have odbc.lib
1115 in your compiler library path.
1116
1117 The minimum you need to distribute with your application is odbc.dll, which must
1118 go in the Windows system directory. For the application to function correctly,
1119 ODBC drivers must be installed on the user's machine. If you do not use the database
1120 classes, odbc.dll will be loaded but not called (so ODBC does not need to be
1121 setup fully if no ODBC calls will be made).
1122
1123 A sample is distributed with wxWindows in {\tt samples/odbc}. You will need to install
1124 the sample dbf file as a data source using the ODBC setup utility, available from
1125 the control panel if ODBC has been fully installed.
1126
1127 \subsection{Procedures for writing an ODBC application using wxDatabase [DEPRECATED]}
1128
1129 You first need to create a wxDatabase object. If you want to get information
1130 from the ODBC manager instead of from a particular database (for example
1131 using \helpref{wxRecordSet::GetDataSources}{wxrecordsetgetdatasources}), then you
1132 do not need to call \helpref{wxDatabase::Open}{wxdatabaseopen}.
1133 If you do wish to connect to a datasource, then call wxDatabase::Open.
1134 You can reuse your wxDatabase object, calling wxDatabase::Close and wxDatabase::Open
1135 multiple times.
1136
1137 Then, create a wxRecordSet object for retrieving or sending information.
1138 For ODBC manager information retrieval, you can create it as a dynaset (retrieve the
1139 information as needed) or a snapshot (get all the data at once).
1140 If you are going to call \helpref{wxRecordSet::ExecuteSQL}{wxrecordsetexecutesql}, you need to create it as a snapshot.
1141 Dynaset mode is not yet implemented for user data.
1142
1143 Having called a function such as wxRecordSet::ExecuteSQL or
1144 wxRecordSet::GetDataSources, you may have a number of records
1145 associated with the recordset, if appropriate to the operation. You can
1146 now retrieve information such as the number of records retrieved and the
1147 actual data itself. Use \helpref{wxRecordSet::GetFieldData}{wxrecordsetgetfielddata} or
1148 \helpref{wxRecordSet::GetFieldDataPtr}{wxrecordsetgetfielddataptr} to get the data or a pointer to it, passing
1149 a column index or name. The data returned will be for the current
1150 record. To move around the records, use \helpref{wxRecordSet::MoveNext}{wxrecordsetmovenext},
1151 \rtfsp\helpref{wxRecordSet::MovePrev}{wxrecordsetmoveprev} and associated functions.
1152
1153 You can use the same recordset for multiple operations, or delete
1154 the recordset and create a new one.
1155
1156 Note that when you delete a wxDatabase, any associated recordsets
1157 also get deleted, so beware of holding onto invalid pointers.
1158
1159 \subsection{wxDatabase class overview [DEPRECATED]}\label{wxdatabaseoverview}
1160
1161 Class: \helpref{wxDatabase}{wxdatabase}
1162
1163 \wxheading{DEPRECATED}
1164
1165 Use \helpref{wxDb}{wxdb} and \helpref{wxDbTable}{wxdbtable} instead.
1166
1167 Every database object represents an ODBC connection. To do anything useful
1168 with a database object you need to bind a wxRecordSet object to it. All you
1169 can do with wxDatabase is opening/closing connections and getting some info
1170 about it (users, passwords, and so on).
1171
1172 \wxheading{See also}
1173
1174 \helpref{Database classes overview}{odbcoverview}
1175
1176 \subsection{wxQueryCol class overview [DEPRECATED]}\label{wxquerycoloverview}
1177
1178 Class: \helpref{wxQueryCol}{wxquerycol}
1179
1180 \wxheading{DEPRECATED}
1181
1182 Use \helpref{wxDb}{wxdb} and \helpref{wxDbTable}{wxdbtable} instead.
1183
1184 Every data column is represented by an instance of this class.
1185 It contains the name and type of a column and a list of wxQueryFields where
1186 the real data is stored. The links to user-defined variables are stored
1187 here, as well.
1188
1189 \wxheading{See also}
1190
1191 \helpref{Database classes overview}{odbcoverview}
1192
1193 \subsection{wxQueryField class overview [DEPRECATED]}\label{wxqueryfieldoverview}
1194
1195 Class: \helpref{wxQueryField}{wxqueryfield}
1196
1197 \wxheading{DEPRECATED}
1198
1199 Use \helpref{wxDb}{wxdb} and \helpref{wxDbTable}{wxdbtable} instead.
1200
1201 As every data column is represented by an instance of the class wxQueryCol,
1202 every data item of a specific column is represented by an instance of
1203 wxQueryField. Each column contains a list of wxQueryFields. If wxRecordSet is
1204 of the type wxOPEN\_TYPE\_DYNASET, there will be only one field for each column,
1205 which will be updated every time you call functions like wxRecordSet::Move
1206 or wxRecordSet::GoTo. If wxRecordSet is of the type wxOPEN\_TYPE\_SNAPSHOT,
1207 all data returned by an ODBC function will be loaded at once and the number
1208 of wxQueryField instances for each column will depend on the number of records.
1209
1210 \wxheading{See also}
1211
1212 \helpref{Database classes overview}{odbcoverview}
1213
1214 \subsection{wxRecordSet overview [DEPRECATED]}\label{wxrecordsetoverview}
1215
1216 Class: \helpref{wxRecordSet}{wxrecordset}
1217
1218 \wxheading{DEPRECATED}
1219
1220 Use \helpref{wxDb}{wxdb} and \helpref{wxDbTable}{wxdbtable} instead.
1221
1222
1223 Each wxRecordSet represents a database query. You can make multiple queries
1224 at a time by using multiple wxRecordSets with a wxDatabase or you can make
1225 your queries in sequential order using the same wxRecordSet.
1226
1227 \wxheading{See also}
1228
1229 \helpref{Database classes overview}{odbcoverview}
1230
1231 \subsection{ODBC SQL data types [DEPRECATED]}\label{sqltypes}
1232
1233 These are the data types supported in ODBC SQL. Note that there are other, extended level conformance
1234 types, not currently supported in wxWindows.
1235
1236 \begin{twocollist}\itemsep=0pt
1237 \twocolitem{CHAR(n)}{A character string of fixed length {\it n}.}
1238 \twocolitem{VARCHAR(n)}{A varying length character string of maximum length {\it n}.}
1239 \twocolitem{LONG VARCHAR(n)}{A varying length character string: equivalent to VARCHAR for the purposes
1240 of ODBC.}
1241 \twocolitem{DECIMAL(p, s)}{An exact numeric of precision {\it p} and scale {\it s}.}
1242 \twocolitem{NUMERIC(p, s)}{Same as DECIMAL.}
1243 \twocolitem{SMALLINT}{A 2 byte integer.}
1244 \twocolitem{INTEGER}{A 4 byte integer.}
1245 \twocolitem{REAL}{A 4 byte floating point number.}
1246 \twocolitem{FLOAT}{An 8 byte floating point number.}
1247 \twocolitem{DOUBLE PRECISION}{Same as FLOAT.}
1248 \end{twocollist}
1249
1250 These data types correspond to the following ODBC identifiers:
1251
1252 \begin{twocollist}\itemsep=0pt
1253 \twocolitem{SQL\_CHAR}{A character string of fixed length.}
1254 \twocolitem{SQL\_VARCHAR}{A varying length character string.}
1255 \twocolitem{SQL\_DECIMAL}{An exact numeric.}
1256 \twocolitem{SQL\_NUMERIC}{Same as SQL\_DECIMAL.}
1257 \twocolitem{SQL\_SMALLINT}{A 2 byte integer.}
1258 \twocolitem{SQL\_INTEGER}{A 4 byte integer.}
1259 \twocolitem{SQL\_REAL}{A 4 byte floating point number.}
1260 \twocolitem{SQL\_FLOAT}{An 8 byte floating point number.}
1261 \twocolitem{SQL\_DOUBLE}{Same as SQL\_FLOAT.}
1262 \end{twocollist}
1263
1264 \wxheading{See also}
1265
1266 \helpref{Database classes overview}{odbcoverview}
1267
1268 \subsection{A selection of SQL commands [DEPRECATED]}\label{sqlcommands}
1269
1270 The following is a very brief description of some common SQL commands, with
1271 examples.
1272
1273 \wxheading{See also}
1274
1275 \helpref{Database classes overview}{odbcoverview}
1276
1277 \subsubsection{Create}
1278
1279 Creates a table.
1280
1281 Example:
1282
1283 \begin{verbatim}
1284 CREATE TABLE Book
1285 (BookNumber INTEGER PRIMARY KEY
1286 , CategoryCode CHAR(2) DEFAULT 'RO' NOT NULL
1287 , Title VARCHAR(100) UNIQUE
1288 , NumberOfPages SMALLINT
1289 , RetailPriceAmount NUMERIC(5,2)
1290 )
1291 \end{verbatim}
1292
1293 \subsubsection{Insert}
1294
1295 Inserts records into a table.
1296
1297 Example:
1298
1299 \begin{verbatim}
1300 INSERT INTO Book
1301 (BookNumber, CategoryCode, Title)
1302 VALUES(5, 'HR', 'The Lark Ascending')
1303 \end{verbatim}
1304
1305 \subsubsection{Select}
1306
1307 The Select operation retrieves rows and columns from a table. The criteria
1308 for selection and the columns returned may be specified.
1309
1310 Examples:
1311
1312 \verb$SELECT * FROM Book$
1313
1314 Selects all rows and columns from table Book.
1315
1316 \verb$SELECT Title, RetailPriceAmount FROM Book WHERE RetailPriceAmount > 20.0$
1317
1318 Selects columns Title and RetailPriceAmount from table Book, returning only
1319 the rows that match the WHERE clause.
1320
1321 \verb$SELECT * FROM Book WHERE CatCode = 'LL' OR CatCode = 'RR'$
1322
1323 Selects all columns from table Book, returning only
1324 the rows that match the WHERE clause.
1325
1326 \verb$SELECT * FROM Book WHERE CatCode IS NULL$
1327
1328 Selects all columns from table Book, returning only rows where the CatCode column
1329 is NULL.
1330
1331 \verb$SELECT * FROM Book ORDER BY Title$
1332
1333 Selects all columns from table Book, ordering by Title, in ascending order. To specify
1334 descending order, add DESC after the ORDER BY Title clause.
1335
1336 \verb$SELECT Title FROM Book WHERE RetailPriceAmount >= 20.0 AND RetailPriceAmount <= 35.0$
1337
1338 Selects records where RetailPriceAmount conforms to the WHERE expression.
1339
1340 \subsubsection{Update}
1341
1342 Updates records in a table.
1343
1344 Example:
1345
1346 \verb$UPDATE Incident SET X = 123 WHERE ASSET = 'BD34'$
1347
1348 This example sets a field in column `X' to the number 123, for the record
1349 where the column ASSET has the value `BD34'.
1350
1351
1352