1 \section{Database classes overview
}\label{odbcoverview
}
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.
}
11 \subsection{Different ODBC Class Libraries in wxWindows
}
13 Following is a 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 recommended wxWindows classes for database
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.
28 \subsection{wxDb/wxDbTable wxODBC Overview
}\label{wxodbcoverview
}
30 Classes:
\helpref{wxDb
}{wxdb
},
\helpref{wxDbTable
}{wxdbtable
}
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 differently. 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.
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:
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)
62 An up-to-date list can be obtained by looking in the comments of the function
63 \helpref{wxDb::Dbms
}{wxdbdbms
} in db.cpp, or in the enumerated type
64 \helpref{wxDBMS
}{wxdbenumeratedtypes
} in db.h.
66 **dBase is not truly an ODBC datasource, but there are drivers which can
67 emulate much of the functionality of an ODBC connection to a dBase table.
68 See the
\helpref{wxODBC Known Issues
}{wxodbcknownissues
} section of this
72 \subsection{wxODBC Where To Start
}\label{wxodbcwheretostart
}
74 First, if you are not familiar with SQL and ODBC, go to your local bookstore
75 and pick up a good book on each. This documentation is not meant to teach
76 you many details about SQL or ODBC, though you may learn some just from
77 immersion in the subject.
79 If you have worked with non-SQL/ODBC datasources before, there are some
80 things you will need to un-learn. First some terminology as these phrases will
81 be used heavily in this section of the manual.
83 \begin{twocollist
}\itemsep=
0pt
84 \twocolitem{Datasource
}{(usually a database) that contains the data that will be
85 accessed by the wxODBC classes.
}
86 \twocolitem{Data table
}{The section of the datasource that contains the rows and
88 \twocolitem{ODBC driver
}{The middle-ware software that interprets the ODBC
89 commands sent by your application and converts them to the SQL format expected
90 by the target datasource.
}
91 \twocolitem{Datasource connection
}{An open pipe between your application and
92 the ODBC driver which in turn has a connection to the target datasource.
93 Datasource connections can have a virtually unlimited number of wxDbTable
94 instances using the same connect (dependent on the ODBC driver). A separate
95 connection is not needed for each table (the exception is for isolating
96 commits/rollbacks on different tables from affecting more than the desired
97 table. See the class documentation on
98 \helpref{wxDb::CommitTrans
}{wxdbcommittrans
} and
99 \helpref{wxDb::RollbackTrans
}{wxdbrollbacktrans
}.)
}
100 \twocolitem{Rows
}{Similar to records in old relational databases, a row is a
101 collection of one instance of each column of the data table that are all
102 associated with each other.
}
103 \twocolitem{Columns
}{Individual fields associated with each row of a data
105 \twocolitem{Query
}{Request from the client to the datasource asking for
106 the data that matches the requirements specified in the users request. When
107 a query is performed, the datasource performs the lookup of the rows with
108 satisfy the query, and creates a result set.
}
109 \twocolitem{Result set
}{The data which matches the requirements specified
110 in a query sent to the datasource. Dependent on drivers, a result set
111 typically remains at the datasource (no data is transmitted to the ODBC driver)
112 until the client actually instructs the ODBC driver to retrieve it.
}
113 \twocolitem{Cursor
}{A logical pointer into the result set that a query
114 generates, indicating the next record that will be returned to the client
115 when a request for the next record is made.
}
116 \twocolitem{Scrolling cursors
}{Scrolling refers to the movement of cursors
117 through the result set. Cursors can always scroll forward sequentially in
118 the result set (FORWARD ONLY scrolling cursors). With Forward only scrolling
119 cursors, once a row in the result set has been returned to the ODBC driver
120 and on to the client, there is no way to have the cursor move backward in
121 the result set to look at the row that is previous to the current row in
122 the result set. If BACKWARD scrolling cursors are supported by both the
123 ODBC driver and the datasource that are being used, then backward
124 scrolling cursor functions may be used (
125 \helpref{wxDbTable::GetPrev
}{wxdbtablegetprev
},
126 \helpref{wxDbTable::GetFirst
}{wxdbtablegetfirst
}, and
127 \helpref{wxDbTable::GetLast
}{wxdbtablegetlast
}). If the datasource or the
128 ODBC driver only support forward scrolling cursors, your program and logic
129 must take this in to account.
}
130 \twocolitem{Commit/Rollback
}{Commit will physically save
131 insertions/deletions/updates, while rollback basically does an undo of
132 everything done against the datasource connection that has not been
133 previously committed. Note that Commit and Rollbacks are done on a
134 connection, not on individual tables. All tables which use a shared
135 connection to the datasource are all committed/rolled back at the same
137 \helpref{wxDb::CommitTrans
}{wxdbcommittrans
} or
138 \helpref{wxDb::RollbackTrans
}{wxdbrollbacktrans
} is made.
}
139 \twocolitem{Index
}{Indexes are datasource-maintained lookup structures
140 that allow the datasource to quickly locate data rows based on the values
141 of certain columns. Without indexes, the datasource would need to do a
142 sequential search of a table every time a query request is made. Proper
143 unique key index construction can make datasource queries nearly instantaneous.
}
146 Before you are able to read data from a data table in a datasource, you must
147 have a connection to the datasource. Each datasource connection may be used
148 to open multiple tables all on the same connection (number of tables open are
149 dependent on the driver, datasource configuration and the amount of memory on
150 the client workstation). Multiple connections can be opened to the same
151 datasource by the same client (number of concurrent connections is dependent
152 on the driver and datasource configuration).
154 When a query is performed, the client passes the query to the ODBC driver,
155 and the driver then translates it and passes it along to the datasource. The
156 database engine (in most cases - exceptions are text and dBase files) running
157 on the machine hosting the database does all the work of performing the search
158 for the requested data. The client simply waits for a status to come back
159 through the ODBC driver from the datasource.
161 Depending on the ODBC driver, the result set either remains "queued" on the
162 database server side, or is transferred to the machine that the driver is
163 queued on. The client does not receive this data. The client must request
164 some or all of the result set to be returned before any data rows are
165 returned to the client application.
167 Result sets do not need to include all columns of every row matching the
168 query. In fact, result sets can actually be joinings of columns from two
169 or more data tables, may have derived column values, or calculated values
172 For each result set, a cursor is maintained (typically by the database)
173 which keeps track of where in the result set the user currently is.
174 Depending on the database, ODBC driver, and how you configured the
175 wxWindows ODBC settings in setup.h (see
\helpref{wxODBC - Compiling
}{wxodbccompiling
}), cursors can be
176 either forward or backward scrolling. At a minimum, cursors must scroll
177 forward. For example, if a query resulted in a result set with
100 rows,
178 as the data is read by the client application, it will read row
1, then
2,
179 then
3, etc. With forward only cursors, once the cursor has moved to
180 the next row, the previous row cannot be accessed again without re-querying
181 the datasource for the result set over again. Backward scrolling cursors
182 allow you to request the previous row from the result set, actually
183 scrolling the cursor backward.
185 Backward scrolling cursors are not supported on all database/driver
186 combinations. For this reason, forward-only cursors are the default in
187 the wxODBC classes. If your datasource does support backward scrolling
188 cursors and you wish to use them, make the appropriate changes in setup.h
189 to enable them (see
\helpref{wxODBC - Compiling
}{wxodbccompiling
}). For greatest portability between
190 datasources, writing your program in such a way that it only requires
191 forward scrolling cursors is your best bet. On the other hand, if you are
192 focusing on using only datasources that support backward scrolling cursors,
193 potentially large performance benefits can be gained from using them.
195 There is a limit to the number of cursors that can be open on each connection
196 to the datasource, and usually a maximum number of cursors for the datasource
197 itself. This is all dependent on the database. Each connection that is
198 opened (each instance of a wxDb) opens a minimum of
5 cursors on creation
199 that are required for things such as updates/deletions/rollbacks/queries.
200 Cursors are a limited resource, so use care in creating large numbers of
203 Additional cursors can be created if necessary with the
204 \helpref{wxDbTable::GetNewCursor
}{wxdbtablegetnewcursor
} function. One example
205 use for additional cursors is to track multiple scroll points in result
206 sets. By creating a new cursor, a program could request a second result set
207 from the datasource while still maintaining the original cursor position in
208 the first result set.
210 Different than non-SQL/ODBC datasources, when a program performs an
211 insertion, deletion, or update (or other SQL functions like altering
212 tables, etc) through ODBC, the program must issue a "commit" to the
213 datasource to tell the datasource that the action(s) it has been told to
214 perform are to be recorded as permanent. Until a commit is performed,
215 any other programs that query the datasource will not see the changes that
216 have been made (although there are databases that can be configured to
217 auto-commit). NOTE: With most datasources, until the commit is
218 performed, any cursor that is open on that same datasource connection
219 will be able to see the changes that are uncommitted. Check your
220 database's documentation/configuration to verify this before relying on it
223 A rollback is basically an UNDO command on the datasource connection. When
224 a rollback is issued, the datasource will flush all commands it has been told
225 to do since the last commit that was performed.
227 NOTE: Commits/Rollbacks are done on datasource connections (wxDb instances)
228 not on the wxDbTable instances. This means that if more than one table
229 shares the same connection, and a commit or rollback is done on that
230 connection, all pending changes for ALL tables using that connection are
231 committed/rolled back.
233 \subsection{wxODBC - Configuring your system for ODBC use
}\label{wxodbcconfiguringyoursystem
}
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.
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. Rumour 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.
245 Whatever the reason, for database-intensive applications, you may want to
246 consider 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.
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 user who configured the DSN.
259 Under Unix, iODBC is used for implementation of the ODBC API. To compile the
260 wxODBC classes, you must first obtain iODBC from
\urlref{http://www.iodbc.org
}{www.iodbc.org
} and install it.
261 (Note: wxWindows currently includes a version of iODBC.) 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:
270 Driver = /usr/local/lib/libmyodbc.so
272 SERVER =
192.168.1.13
278 \subsection{wxODBC - Compiling
}\label{wxodbccompiling
}
280 The wxWindows setup.h file has several settings in it pertaining to compiling
283 \begin{twocollist
}\itemsep=
0pt
284 \twocolitem{wxUSE
\_ODBC}{This must be set to
1 in order for the compiler to
285 compile the wxODBC classes. Without setting this to
1, there will be no
286 access to any of the wxODBC classes. The default is
0.
}
287 \twocolitem{wxODBC
\_FWD\_ONLY\_CURSORS}{When a new database connection is
288 requested, this setting controls the default of whether the connection allows
289 only forward scrolling cursors, or forward and backward scrolling cursors
290 (see the section in "WHERE TO START" on cursors for more information on
291 cursors). This default can be overridden by passing a second parameter to
292 either the
\helpref{wxDbGetConnection
}{wxdbfunctions
} or
293 \helpref{wxDb constructor
}{wxdbconstr
}. The default is
1.
}
294 \twocolitem{wxODBC
\_BACKWARD\_COMPATABILITY}{Between v2.0 and
2.2, massive
295 renaming efforts were done to the ODBC classes to get naming conventions
296 similar to those used throughout wxWindows, as well as to preface all wxODBC
297 classes names and functions with a wxDb preface. Because this renaming would
298 affect applications written using the v2.0 names, this compile-time directive
299 was added to allow those programs written for v2.0 to still compile using the
300 old naming conventions. These deprecated names are all
{\tt\#
}define'd to their
301 corresponding new function names at the end of the db.cpp/dbtable.cpp source
302 files. These deprecated class/function names should not be used in future
303 development, as at some point in the future they will be removed. The default
307 {\it Under MS Windows
}
309 You are required to include the "odbc32.lib" provided by your compiler vendor
310 in the list of external libraries to be linked in. If using the makefiles
311 supplied with wxWindows, this library should already be included for use with
312 makefile.b32, makefile.vc, and makefile.g95.
314 You cannot compile the wxODBC classes under Win16 - sorry.
316 \normalbox{MORE TO COME
}
319 --with-odbc flag for configure
321 \normalbox{MORE TO COME
}
323 \subsection{wxODBC - Basic Step-By-Step Guide
}\label{wxodbcstepbystep
}
325 To use the classes in an application, there are eight basic steps:
327 \begin{itemize
}\itemsep=
0pt
328 \item Define datasource connection information
329 \item Get a datasource connection
330 \item Create table definition
333 \item Close the table
334 \item Close the datasource connection
335 \item Release the ODBC environment handle
338 Following each of these steps is detailed to explain the step, and to
339 hopefully mention as many of the pitfalls that beginning users fall in
340 to when first starting to use the classes. Throughout the steps, small
341 snippets of code are provided to show the syntax of performing the step. A
342 complete code snippet is provided at the end of this overview that shows a
343 complete working flow of all these steps (see
344 \helpref{wxODBC - Sample Code
{\tt\#
}1}{wxodbcsamplecode1
}).
346 {\bf Define datasource connection information
}
348 To be able to connect to a datasource through the ODBC driver, a program must
349 supply a minimum of three pieces of information: Datasource name, User ID, and
350 Authorization string (password). A fourth piece of information, a default
351 directory indicating where the data file is stored, is required for Text and
352 dBase drivers for ODBC.
354 The wxWindows data class wxDbConnectInf exists for holding all of these
355 values, plus some others that may be desired.
357 The 'Henv' member is the environment handle used to access memory for use by the
358 ODBC driver. Use of this member is described below in the "Getting a Connection
359 to the Datasource" section.
361 The 'Dsn' must exactly match the datasource name used to configure the ODBC
362 datasource (in the ODBC Administrator (MSW only) or in the .odbc.ini file).
364 The 'Uid' is the User ID that is to be used to log in to the datasource. This
365 User ID must already have been created and assigned rights within the
366 datasource to which you are connecting. The user that the connection is
367 establish by will determine what rights and privileges the datasource
368 connection will allow the program to have when using the connection that
369 this connection information was used to establish. Some datasources are
370 case sensitive for User IDs, and though the wxODBC classes attempt to hide
371 this from you by manipulating whatever data you pass in to match the
372 datasource's needs, it is always best to pass the 'Uid' in the case that
373 the datasource requires.
375 The 'AuthStr' is the password for the User ID specified in the 'Uid' member.
376 As with the 'Uid', some datasources are case sensitive (in fact most are).
377 The wxODBC classes do NOT try to manage the case of the 'AuthStr' at all.
378 It is passed verbatim to the datasource, so you must use the case that the
379 datasource is expecting.
381 The 'defaultDir' member is used with file based datasources (i.e. dBase,
382 FoxPro, text files). It contains a full path to the location where the
383 data table or file is located. When setting this value, use forward
384 slashes '/' rather than backslashes '\' to avoid compatibility differences
385 between ODBC drivers.
387 The other fields are currently unused. The intent of these fields are that
388 they will be used to write our own ODBC Administrator type program that will
389 work on both MSW and Un*x systems, regardless of the datasource. Very little
390 work has been done on this to date.
392 {\bf Get a Datasource Connection
}
394 There are two methods of establishing a connection to a datasource. You
395 may either manually create your own wxDb instance and open the connection,
396 or you may use the caching functions provided with the wxODBC classes to
397 create/maintain/delete the connections.
399 Regardless of which method you use, you must first have a fully populated
400 wxDbConnectInf object. In the wxDbConnectInf instance, provide a valid
401 Dns, Uid, and AuthStr (along with a 'defaultDir' if necessary). Before
402 using this though, you must allocate an environment handle to the 'Henv'
406 wxDbConnectInf DbConnectInf;
407 DbConnectInf.SetDsn("MyDSN");
408 DbConnectInf.SetUserID("MyUserName");
409 DbConnectInf.SetPassword("MyPassword");
410 DbConnectInf.SetDefaultDir("");
413 To allocate an environment handle for the ODBC connection to use, the
414 wxDbConnectInf class has a datasource independent method for creating
415 the necessary handle:
418 if (DbConnectInf.AllocHenv())
420 wxMessageBox("Unable to allocate an ODBC environment handle",
421 "DB CONNECTION ERROR", wxOK | wxICON_EXCLAMATION);
426 When the wxDbConnectInf::AllocHenv() function is called successfully, a
427 value of TRUE will be returned. A value of FALSE means allocation failed,
428 and the handle will be undefined.
430 A shorter form of doing the above steps is encapsulated into the
431 long form of the constructor for wxDbConnectInf.
434 wxDbConnectInf *DbConnectInf;
436 DbConnectInf = new wxDbConnectInf(NULL, "MyDSN", "MyUserName",
440 This shorthand form of initializing the constructor passes a NULL for the SQL
441 environment handle, telling the constructor to allocate a handle during
442 construction. This handle is also managed for the life of wxDbConnectInf
443 instance, and is freed automatically upon destruction of the instance.
445 Once the wxDbConnectInf instance is initialized, you are ready to
446 connect to the datasource.
448 To manually create datasource connections, you must create a wxDb
449 instance, and then open it.
452 wxDb *db = new wxDb(DbConnectInf->GetHenv());
454 opened = db->Open(DbConnectInf);
457 The first line does the house keeping needed to initialize all
458 the members of the wxDb class. The second line actually sends the request
459 to the ODBC driver to open a connection to its associated datasource using
460 the parameters supplied in the call to
\helpref{wxDb::Open
}{wxdbopen
}.
462 A more advanced form of opening a connection is to use the connection
463 caching functions that are included with the wxODBC classes. The caching
464 mechanisms perform the same functions as the manual approach to opening a
465 connection, but they also manage each connection they have created,
466 re-using them and cleaning them up when they are closed, without you
467 needing to do the coding.
469 To use the caching function
\helpref{wxDbGetConnection
}{wxdbfunctions
} to get
470 a connection to a datasource, simply call it with a single parameter of the
474 db = wxDbGetConnection(DbConnectInf);
477 The wxDb pointer that is returned is both initialized and opened. If
478 something failed in creating or opening the connection, the return value
479 from
\helpref{wxDbGetConnection
}{wxdbfunctions
} will be NULL.
481 The connection that is returned is either a new connection, or it is a
482 "free" connection from the cache of connections that the class maintains
483 that was no longer in use. Any wxDb instance created with a call to
484 \helpref{wxDbGetConnection
}{wxdbfunctions
} is recorded in a linked list of established
485 connections. When a program is finished with a connection, a call to
486 \helpref{wxDbFreeConnection
}{wxdbfunctions
} is made, and the datasource
487 connection will then be tagged as FREE, making it available for the next
488 call to
\helpref{wxDbGetConnection
}{wxdbfunctions
} that needs a connection
489 using the same connection information (Dsn, Uid, AuthStr). The cached
490 connections remain cached until a call to
\helpref{wxDbCloseConnections
}{wxdbfunctions
} is made,
491 at which time all cached connections are closed and deleted.
493 Besides the obvious advantage of using the single command caching routine to
494 obtain a datasource connection, using cached connections can be quite a
495 performance boost as well. Each time that a new connection is created
496 (not retrieved from the cache of free connections), the wxODBC classes
497 perform many queries against the datasource to determine the datasource's
498 datatypes and other fundamental behaviours. Depending on the hardware,
499 network bandwidth, and datasource speed, this can in some cases take a
500 few seconds to establish the new connection (with well-balanced systems,
501 it should only be a fraction of a second). Re-using already established
502 datasource connections rather than creating/deleting, creating/deleting
503 connections can be quite a time-saver.
505 Another time-saver is the "copy connection" features of both
506 \helpref{wxDb::Open
}{wxdbopen
} and
\helpref{wxDbGetConnection
}{wxdbfunctions
}.
507 If manually creating a wxDb instance and opening it, you must pass an existing
508 connection to the
\helpref{wxDb::Open
}{wxdbopen
} function yourself to gain the performance
509 benefit of copying existing connection settings. The
510 \helpref{wxDbGetConnection
}{wxdbfunctions
} function automatically does this
511 for you, checking the Dsn, Uid, and AuthStr parameters when you request
512 a connection for any existing connections that use those same settings.
513 If one is found,
\helpref{wxDbGetConnection
}{wxdbfunctions
} copies the datasource settings for
514 datatypes and other datasource specific information that was previously
515 queried, rather than re-querying the datasource for all those same settings.
517 One final note on creating a connection. When a connection is created, it
518 will default to only allowing cursor scrolling to be either forward only,
519 or both backward and forward scrolling. The default behavior is
520 determined by the setting
{\tt wxODBC
\_FWD\_ONLY\_CURSORS} in setup.h when you
521 compile the wxWindows library. The library default is to only support
522 forward scrolling cursors only, though this can be overridden by parameters
523 for wxDb() constructor or the
\helpref{wxDbGetConnection
}{wxdbfunctions
}
524 function. All datasources and ODBC drivers must support forward scrolling
525 cursors. Many datasources support backward scrolling cursors, and many
526 ODBC drivers support backward scrolling cursors. Before planning on using
527 backward scrolling cursors, you must be certain that both your datasource
528 and ODBC driver fully support backward scrolling cursors. See the small
529 blurb about "Scrolling cursors" in the definitions at the beginning of
530 this overview, or other details of setting the cursor behavior in the wxDb
533 {\bf Create Table Definition
}
535 Data can be accessed in a datasource's tables directly through various
536 functions of the wxDb class (see
\helpref{wxDb::GetData
}{wxdbgetdata
}). But to make life much
537 simpler, the wxDbTable class encapsulates all of the SQL specific API calls
538 that would be necessary to do this, wrapping it in an intuitive class of APIs.
540 The first step in accessing data in a datasource's tables via the wxDbTable
541 class is to create a wxDbTable instance.
544 table = new wxDbTable(db, tableName, numTableColumns, "",
545 !wxDB_QUERY_ONLY, "");
548 When you create the instance, you indicate the previously established
549 datasource connection to be used to access the table, the name of the
550 primary table that is to be accessed with the datasource's tables, how many
551 columns of each row are going to be returned, the name of the view of the
552 table that will actually be used to query against (works with Oracle only
553 at this time), whether the data returned is for query purposes only, and
554 finally the path to the table, if different than the path specified when
555 connecting to the datasource.
557 Each of the above parameters are described in detail in the wxDbTable
558 class' description, but one special note here about the fifth
559 parameter - the queryOnly setting. If a wxDbTable instance is created as
560 {\tt wxDB
\_QUERY\_ONLY}, then no inserts/deletes/updates can be performed
561 using this instance of the wxDbTable. Any calls to
\helpref{wxDb::CommitTrans
}{wxdbcommittrans
}
562 or
\helpref{wxDb::RollbackTrans
}{wxdbrollbacktrans
} against the datasource
563 connection used by this wxDbTable instance are ignored by this instance. If
564 the wxDbTable instance is created with
{\tt !wxDB
\_QUERY\_ONLY} as shown above,
565 then all the cursors and other overhead associated with being able to
566 insert/update/delete data in the table are created, and thereby those
567 operations can then be performed against the associated table with this
570 If a table is to be accessed via a wxDbTable instance, and the table will
571 only be read from, not written to, there is a performance benefit (not as
572 many cursors need to be maintained/updated, hence speeding up access times),
573 as well as a resource savings due to fewer cursors being created for the
574 wxDbTable instance. Also, with some datasources, the number of
575 simultaneous cursors is limited.
577 When defining the columns to be retrievable by the wxDbTable instance, you
578 can specify anywhere from one column up to all columns in the table.
581 table->SetColDefs(
0, "FIRST_NAME", DB_DATA_TYPE_VARCHAR, FirstName,
582 SQL_C_CHAR, sizeof(name), TRUE, TRUE);
583 table->SetColDefs(
1, "LAST_NAME", DB_DATA_TYPE_VARCHAR, LastName,
584 SQL_C_CHAR, sizeof(LastName), TRUE, TRUE);
587 Notice that column definitions start at index
0 and go up to one less than
588 the number of columns specified when the wxDbTable instance was created
589 (in this example, two columns - one with index
0, one with index
1).
591 The above lines of code "bind" the datasource columns specified to the
592 memory variables in the client application. So when the application
593 makes a call to
\helpref{wxDbTable::GetNext
}{wxdbtablegetnext
} (or any other function that retrieves
594 data from the result set), the variables that are bound to the columns will
595 have the column value stored into them. See the
596 \helpref{wxDbTable::SetColDefs
}{wxdbtablesetcoldefs
}
597 class documentation for more details on all the parameters for this function.
599 The bound memory variables have undefined data in them until a call to a
600 function that retrieves data from a result set is made
601 (e.g.
\helpref{wxDbTable::GetNext
}{wxdbtablegetnext
},
602 \helpref{wxDbTable::GetPrev
}{wxdbtablegetprev
}, etc). The variables are not
603 initialized to any data by the wxODBC classes, and they still contain
604 undefined data after a call to
\helpref{wxDbTable::Query
}{wxdbtablequery
}. Only
605 after a successful call to one of the ::GetXxxx() functions is made do the
606 variables contain valid data.
608 It is not necessary to define column definitions for columns whose data is
609 not going to be returned to the client. For example, if you want to query
610 the datasource for all users with a first name of 'GEORGE', but you only want
611 the list of last names associated with those rows (why return the FIRST
\_NAME
612 column every time when you already know it is 'GEORGE'), you would only have
613 needed to define one column above.
615 You may have as many wxDbTable instances accessing the same table using the
616 same wxDb instance as you desire. There is no limit imposed by the classes
617 on this. All datasources supported (so far) also have no limitations on this.
621 Opening the table is not technically doing anything with the datasource
622 itself. Calling
\helpref{wxDbTable::Open
}{wxdbtableopen
} simply does all the
623 housekeeping of checking that the specified table exists, that the current
624 connected user has at least SELECT privileges for accessing the table,
625 setting up the requisite cursors, binding columns and cursors, and
626 constructing the default INSERT statement that is used when a new row is
627 inserted into the table (non-wxDB
\_QUERY\_ONLY tables only).
632 // An error occurred opening (setting up) the table
636 The only reason that a call to
\helpref{wxDbTable::Open
}{wxdbtableopen
} is likely to fail is if the
637 user has insufficient privileges to even SELECT the table. Other problems
638 could occur, such as being unable to bind columns, but these other reason
639 point to some lack of resource (like memory). Any errors generated
640 internally in the
\helpref{wxDbTable::Open
}{wxdbtableopen
} function are logged to the error log
641 if SQL logging is turned on for the classes.
645 To use the table and the definitions that are now set up, we must first
646 define what data we want the datasource to collect in to a result set, tell
647 it where to get the data from, and in what sequence we want the data returned.
650 // the WHERE clause limits/specifies which rows in the table
651 // are to be returned in the result set
652 table->SetWhereClause("FIRST_NAME = 'GEORGE'");
654 // Result set will be sorted in ascending alphabetical
655 // order on the data in the 'LAST_NAME' column of each row
656 // If the same last name is in the table for two rows,
657 // sub-sort on the 'AGE' column
658 table->SetOrderByClause("LAST_NAME, AGE");
660 // No other tables (joins) are used for this query
661 table->SetFromClause("");
664 The above lines will be used to tell the datasource to return in the result
665 all the rows in the table whose column "FIRST
\_NAME" contains the name
666 'GEORGE' (note the required use of the single quote around the string
667 literal) and that the result set will return the rows sorted by ascending
668 last names (ascending is the default, and can be overridden with the
669 "DESC" keyword for datasources that support it - "LAST
\_NAME DESC").
671 Specifying a blank WHERE clause will result in the result set containing
672 all rows in the datasource.
674 Specifying a blank ORDERBY clause means that the datasource will return
675 the result set in whatever sequence it encounters rows which match the
676 selection criteria. What this sequence is can be hard to determine.
677 Typically it depends on the index that the datasource used to find the
678 rows which match the WHERE criteria. BEWARE - relying on the datasource
679 to return data in a certain sequence when you have not provided an ORDERBY
680 clause will eventually cause a problem for your program. Databases can be
681 tuned to be COST-based, SPEED-based, or some other basis for how it gets
682 your result set. In short, if you need your result set returned in a
683 specific sequence, ask for it that way by providing an ORDERBY clause.
685 Using an ORDERBY clause can be a performance hit, as the database must
686 sort the items before making the result set available to the client.
687 Creating efficient indexes that cause the data to be "found" in the correct
688 ORDERBY sequence can be a big performance benefit. Also, in the large
689 majority of cases, the database will be able to sort the records faster
690 than your application can read all the records in (unsorted) and then sort
691 them. Let the database do the work for you!
693 Notice in the example above, a column that is not included in the bound
694 data columns ('AGE') will be used to sub-sort the result set.
696 The FROM clause in this example is blanked, as we are not going to be
697 performing any table joins with this simple query. When the FROM clause
698 is blank, it is assumed that all columns referenced are coming from
699 the default table for the wxDbTable instance.
701 After the selection criteria have been specified, the program can now
702 ask the datasource to perform the search and create a result set that
706 // Instruct the datasource to perform a query based on the
707 // criteria specified above in the where/orderBy/from clauses.
710 // An error occurred performing the query
714 Typically, when an error occurs when calling
\helpref{wxDbTable::Query
}{wxdbtablequery
}, it is a
715 syntax problem in the WHERE clause that was specified. The exact SQL
716 (datasource-specific) reason for what caused the failure of
\helpref{wxDbTable::Query
}{wxdbtablequery
}
717 (and all other operations against the datasource can be found by
718 parsing the table's database connection's "errorList
[]" array member for
719 the stored text of the error.
721 When the
\helpref{wxDbTable::Query
}{wxdbtablequery
} returns TRUE, the
722 database was able to successfully complete the requested query using the
723 provided criteria. This does not mean that there are any rows in the
724 result set, it just mean that the query was successful.
726 \normalbox{IMPORTANT: The result created by the call to
727 \helpref{wxDbTable::Query
}{wxdbtablequery
} can take one of two forms. It is
728 either a snapshot of the data at the exact moment that the database
729 determined the record matched the search criteria, or it is a pointer to
730 the row that matched the selection criteria. Which form of behavior is
731 datasource dependent. If it is a snapshot, the data may have changed
732 since the result set was constructed, so beware if your datasource
733 uses snapshots and call
\helpref{wxDbTable::Refresh
}{wxdbtablerefresh
}. Most larger brand databases
734 do not use snapshots, but it is important to mention so that your application
735 can handle it properly if your datasource does.
}
737 To retrieve the data, one of the data fetching routines must be used to
738 request a row from the result set, and to store the data from the result
739 set into the bound memory variables. After
\helpref{wxDbTable::Query
}{wxdbtablequery
}
740 has completed successfully, the default/current cursor is placed so it
741 is pointing just before the first record in the result set. If the
742 result set is empty (no rows matched the criteria), then any calls to
743 retrieve data from the result set will return FALSE.
748 while (table->GetNext())
750 msg.Printf("Row #
%lu -- First Name : %s Last Name is %s",
751 table->GetRowNum(), FirstName, LastName);
752 wxMessageBox(msg, "Data", wxOK | wxICON_INFORMATION, NULL);
756 The sample code above will read the next record in the result set repeatedly
757 until the end of the result set has been reached. The first time that
758 \helpref{wxDbTable::GetNext
}{wxdbtablegetnext
} is called right after the successful
759 call to
\helpref{wxDbTable::Query
}{wxdbtablequery
}, it actually returns the first record
762 When
\helpref{wxDbTable::GetNext
}{wxdbtablegetnext
} is called and there are
763 no rows remaining in the result set after the current cursor position,
764 \helpref{wxDbTable::GetNext
}{wxdbtablegetnext
} (as well as all the other
765 wxDbTable::GetXxxxx() functions) will return FALSE.
767 {\bf Close the table
}
769 When the program is done using a wxDbTable instance, it is as simple as
770 deleting the table pointer (or if declared statically, letting the
771 variable go out of scope). Typically the default destructor will take
772 care of all that is required for cleaning up the wxDbTable instance.
782 Deleting a wxDbTable instance releases all of its cursors, deletes the
783 column definitions and frees the SQL environment handles used by the
784 table (but not the environment handle used by the datasource connection
785 that the wxDbTable instance was using).
787 {\bf Close the datasource connection
}
789 After all tables that have been using a datasource connection have been
790 closed (this can be verified by calling
\helpref{wxDb::GetTableCount
}{wxdbgettablecount
}
791 and checking that it returns
0), then you may close the datasource
792 connection. The method of doing this is dependent on whether the
793 non-caching or caching method was used to obtain the datasource connection.
795 If the datasource connection was created manually (non-cached), closing the
796 connection is done like this:
807 If the program used the
\helpref{wxDbGetConnection
}{wxdbfunctions
} function to get a datasource
808 connection, the following is the code that should be used to free the
814 wxDbFreeConnection(db);
819 Note that the above code just frees the connection so that it can be
820 re-used on the next call the
\helpref{wxDbGetConnection
}{wxdbfunctions
}. To actually dispose
821 of the connection, releasing all of its resources (other than the
822 environment handle), do the following:
825 wxDbCloseConnections();
828 {\bf Release the ODBC environment handle
}
830 Once all of the connections that used the ODBC environment handle (in
831 this example it was stored in "DbConnectInf.Henv") have been closed, then
832 it is safe to release the environment handle:
835 DbConnectInf->FreeHenv();
838 Or, if the long form of the constructor was used and the constructor was allowed
839 to allocate its own SQL environment handle, leaving scope or destruction of the
840 wxDbConnectInf will free the handle automatically.
846 \normalbox{Remember to never release this environment handle if there are any
847 connections still using the handle.
}
849 \subsection{wxODBC - Known Issues
}\label{wxodbcknownissues
}
851 As with creating wxWindows, writing the wxODBC classes was not the simple
852 task of writing an application to run on a single type of computer system.
853 The classes need to be cross-platform for different operating systems, and
854 they also needed to take in to account different database manufacturers and
855 different ODBC driver manufacturers. Because of all the possible combinations
856 of OS/database/drivers, it is impossible to say that these classes will work
857 perfectly with datasource ABC, ODBC driver XYZ, on platform LMN. You may run
858 in to some incompatibilities or unsupported features when moving your
859 application from one environment to another. But that is what makes
860 cross-platform programming fun. It is also pinpoints one of the great
861 things about open source software. It can evolve!
863 The most common difference between different database/ODBC driver
864 manufacturers in regards to these wxODBC classes is the lack of
865 standard error codes being returned to the calling program. Sometimes
866 manufacturers have even changed the error codes between versions of
867 their databases/drivers.
869 In all the tested databases, every effort has been made to determine
870 the correct error codes and handle them in the class members that need
871 to check for specific error codes (such as TABLE DOES NOT EXIST when
872 you try to open a table that has not been created yet). Adding support
873 for additional databases in the future requires adding an entry for the
874 database in the
\helpref{wxDb::Dbms
}{wxdbdbms
} function, and then handling any error codes
875 returned by the datasource that do not match the expected values.
879 Following is a list of known issues and incompatibilities that the
880 wxODBC classes have between different datasources. An up to date
881 listing of known issues can be seen in the comments of the source
882 for
\helpref{wxDb::Dbms
}{wxdbdbms
}.
885 \begin{itemize
}\itemsep=
0pt
886 \item Currently the only database supported by the wxODBC classes to support VIEWS
891 NOTE: dBase is not a true ODBC datasource. You only have access to as much
892 functionality as the driver can emulate.
894 \begin{itemize
}\itemsep=
0pt
895 \item Does not support the SQL
\_TIMESTAMP structure
896 \item Supports only one cursor and one connect (apparently? with Microsoft driver only?)
897 \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
}
898 \item Table names can only be
8 characters long
899 \item Column names can only be
10 characters long
900 \item Currently cannot CREATE a dBase table - bug or limitation of the drivers used??
901 \item Currently cannot insert rows that have integer columns - bug??
905 \begin{itemize
}\itemsep=
0pt
906 \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
907 \item Ignores the keywords 'FOR UPDATE'. Use the HOLDLOCK functionality described above
910 {\it SYBASE (Enterprise)
}
911 \begin{itemize
}\itemsep=
0pt
912 \item If a column is part of the Primary Key, the column cannot be NULL
913 \item Maximum row size is somewhere in the neighborhood of
1920 bytes
917 \begin{itemize
}\itemsep=
0pt
918 \item If a column is part of the Primary Key, the column cannot be NULL.
919 \item Cannot support selecting for update
[\helpref{wxDbTable::CanSelectForUpdate
}{wxdbtablecanselectforupdate
}]. Always returns FALSE.
920 \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)
921 \item Does not support sub-queries in SQL statements
925 \begin{itemize
}\itemsep=
0pt
926 \item Does not support the keywords 'ASC' or 'DESC' as of release v6.5
.0
927 \item Does not support sub-queries in SQL statements
931 \begin{itemize
}\itemsep=
0pt
932 \item Columns which are part of a primary key must be declared as NOT NULL
935 {\bf UNICODE with wxODBC classes
}
937 The ODBC classes support for Unicode is yet in early experimental stage and
938 hasn't been tested extensively. It might work for you or it might not: please
939 report the bugs/problems you have encountered in the latter case.
941 \subsection{wxODBC - Sample Code
{\tt\#
}1}\label{wxodbcsamplecode1
}
943 Simplest example of establishing/opening a connection to an ODBC datasource,
944 binding variables to the columns for read/write usage, opening an
945 existing table in the datasource, setting the query parameters
946 (where/orderBy/from), querying the datasource, reading each row of the
947 result set, then cleaning up.
949 NOTE: Not all error trapping is shown here, to reduce the size of the
950 code and to make it more easily readable.
953 wxDbConnectInf *DbConnectInf = NULL;
955 wxDb *db = NULL; // The database connection
956 wxDbTable *table = NULL; // The data table to access
958 wxChar FirstName
[50+
1]; // buffer for data from column "FIRST_NAME"
959 wxChar LastName
[50+
1]; // buffer for data from column "LAST_NAME"
961 bool errorOccured = FALSE;
963 const wxChar tableName
[] = "CONTACTS";
964 const UWORD numTableColumns =
2; // Number of bound columns
969 DbConnectInf = new wxDbConnectInf(NULL,"MyDSN","MyUserName", "MyPassword");
971 if (!DbConnectInf || !DbConnectInf->GetHenv())
973 wxMessageBox("Unable to allocate an ODBC environment handle",
974 "DB CONNECTION ERROR", wxOK | wxICON_EXCLAMATION);
978 // Get a database connection from the cached connections
979 db = wxDbGetConnection(DbConnectInf);
981 // Create the table connection
982 table = new wxDbTable(db, tableName, numTableColumns, "",
983 !wxDB_QUERY_ONLY, "");
986 // Bind the columns that you wish to retrieve. Note that there must be
987 // 'numTableColumns' calls to SetColDefs(), to match the wxDbTable definition
989 // Not all columns need to be bound, only columns whose values are to be
990 // returned back to the client.
992 table->SetColDefs(
0, "FIRST_NAME", DB_DATA_TYPE_VARCHAR, FirstName,
993 SQL_C_CHAR, sizeof(name), TRUE, TRUE);
994 table->SetColDefs(
1, "LAST_NAME", DB_DATA_TYPE_VARCHAR, LastName,
995 SQL_C_CHAR, sizeof(LastName), TRUE, TRUE);
997 // Open the table for access
1000 // Set the WHERE clause to limit the result set to only
1001 // return all rows that have a value of 'GEORGE' in the
1002 // FIRST_NAME column of the table.
1003 table->SetWhereClause("FIRST_NAME = 'GEORGE'");
1005 // Result set will be sorted in ascending alphabetical
1006 // order on the data in the 'LAST_NAME' column of each row
1007 table->SetOrderByClause("LAST_NAME");
1009 // No other tables (joins) are used for this query
1010 table->SetFromClause("");
1012 // Instruct the datasource to perform a query based on the
1013 // criteria specified above in the where/orderBy/from clauses.
1014 if (!table->Query())
1016 wxMessageBox("Error on Query()","ERROR!",
1017 wxOK | wxICON_EXCLAMATION);
1018 errorOccured = TRUE;
1023 // Start and continue reading every record in the table
1024 // displaying info about each record read.
1025 while (table->GetNext())
1027 msg.Printf("Row #
%lu -- First Name : %s Last Name is %s",
1028 table->GetRowNum(), FirstName, LastName);
1029 wxMessageBox(msg, "Data", wxOK | wxICON_INFORMATION, NULL);
1032 // If the wxDbTable instance was successfully created
1033 // then delete it as I am done with it now.
1040 // If we have a valid wxDb instance, then free the connection
1041 // (meaning release it back in to the cache of datasource
1042 // connections) for the next time a call to wxDbGetConnection()
1046 wxDbFreeConnection(db);
1050 // The program is now ending, so we need to close
1051 // any cached connections that are still being
1053 wxDbCloseConnections();
1055 // Release the environment handle that was created
1056 // for use with the ODBC datasource connections
1057 delete DbConnectInf;
1061 \subsection{wxDatabase ODBC class overview
[DEPRECATED
]}\label{oldwxodbcoverview
}
1063 Classes:
\helpref{wxDatabase
}{wxdatabase
},
\helpref{wxRecordSet
}{wxrecordset
},
\helpref{wxQueryCol
}{wxquerycol
},
1064 \rtfsp\helpref{wxQueryField
}{wxqueryfield
}
1066 \normalboxd{The more sophisticated wxODBC classes (wxDb/wxDbTable) are the
1067 recommended classes for doing database/ODBC work with wxWindows. These new
1068 classes replace the wxWindows v1.6x classes wxDatabase.
1070 Documentation for the old wxDatabase class and its associated classes is still
1071 included in the class documentation and in this overview section, but support
1072 for these old classes has been phased out, and all future development work
1073 is being done solely on the new wxDb/wxDbTable classes.
}
1075 wxWindows provides a set of classes for accessing a subset of Microsoft's ODBC (Open Database Connectivity)
1076 product. Currently, this wrapper is available under MS Windows only, although
1077 ODBC may appear on other platforms, and a generic or product-specific SQL emulator for the ODBC
1078 classes may be provided in wxWindows at a later date.
1080 ODBC presents a unified API (Application Programmer's Interface) to a
1081 wide variety of databases, by interfacing indirectly to each database or
1082 file via an ODBC driver. The language for most of the database
1083 operations is SQL, so you need to learn a small amount of SQL as well as
1084 the wxWindows ODBC wrapper API. Even though the databases may not be
1085 SQL-based, the ODBC drivers translate SQL into appropriate operations
1086 for the database or file: even text files have rudimentary ODBC support,
1087 along with dBASE, Access, Excel and other file formats.
1089 The run-time files for ODBC are bundled with many existing database
1090 packages, including MS Office. The required header files, sql.h and
1091 sqlext.h, are bundled with several compilers including MS VC++ and
1092 Watcom C++. The only other way to obtain these header files is from the
1093 ODBC SDK, which is only available with the MS Developer Network CD-ROMs
1094 -- at great expense. If you have odbc.dll, you can make the required
1095 import library odbc.lib using the tool `implib'. You need to have odbc.lib
1096 in your compiler library path.
1098 The minimum you need to distribute with your application is odbc.dll, which must
1099 go in the Windows system directory. For the application to function correctly,
1100 ODBC drivers must be installed on the user's machine. If you do not use the database
1101 classes, odbc.dll will be loaded but not called (so ODBC does not need to be
1102 setup fully if no ODBC calls will be made).
1104 A sample is distributed with wxWindows in
{\tt samples/odbc
}. You will need to install
1105 the sample dbf file as a data source using the ODBC setup utility, available from
1106 the control panel if ODBC has been fully installed.
1108 \subsection{Procedures for writing an ODBC application using wxDatabase
[DEPRECATED
]}
1110 You first need to create a wxDatabase object. If you want to get information
1111 from the ODBC manager instead of from a particular database (for example
1112 using
\helpref{wxRecordSet::GetDataSources
}{wxrecordsetgetdatasources
}), then you
1113 do not need to call
\helpref{wxDatabase::Open
}{wxdatabaseopen
}.
1114 If you do wish to connect to a datasource, then call wxDatabase::Open.
1115 You can reuse your wxDatabase object, calling wxDatabase::Close and wxDatabase::Open
1118 Then, create a wxRecordSet object for retrieving or sending information.
1119 For ODBC manager information retrieval, you can create it as a dynaset (retrieve the
1120 information as needed) or a snapshot (get all the data at once).
1121 If you are going to call
\helpref{wxRecordSet::ExecuteSQL
}{wxrecordsetexecutesql
}, you need to create it as a snapshot.
1122 Dynaset mode is not yet implemented for user data.
1124 Having called a function such as wxRecordSet::ExecuteSQL or
1125 wxRecordSet::GetDataSources, you may have a number of records
1126 associated with the recordset, if appropriate to the operation. You can
1127 now retrieve information such as the number of records retrieved and the
1128 actual data itself. Use
\helpref{wxRecordSet::GetFieldData
}{wxrecordsetgetfielddata
} or
1129 \helpref{wxRecordSet::GetFieldDataPtr
}{wxrecordsetgetfielddataptr
} to get the data or a pointer to it, passing
1130 a column index or name. The data returned will be for the current
1131 record. To move around the records, use
\helpref{wxRecordSet::MoveNext
}{wxrecordsetmovenext
},
1132 \rtfsp\helpref{wxRecordSet::MovePrev
}{wxrecordsetmoveprev
} and associated functions.
1134 You can use the same recordset for multiple operations, or delete
1135 the recordset and create a new one.
1137 Note that when you delete a wxDatabase, any associated recordsets
1138 also get deleted, so beware of holding onto invalid pointers.
1140 \subsection{wxDatabase class overview
[DEPRECATED
]}\label{wxdatabaseoverview
}
1142 Class:
\helpref{wxDatabase
}{wxdatabase
}
1144 \wxheading{DEPRECATED
}
1146 Use
\helpref{wxDb
}{wxdb
} and
\helpref{wxDbTable
}{wxdbtable
} instead.
1148 Every database object represents an ODBC connection. To do anything useful
1149 with a database object you need to bind a wxRecordSet object to it. All you
1150 can do with wxDatabase is opening/closing connections and getting some info
1151 about it (users, passwords, and so on).
1153 \wxheading{See also
}
1155 \helpref{Database classes overview
}{odbcoverview
}
1157 \subsection{wxQueryCol class overview
[DEPRECATED
]}\label{wxquerycoloverview
}
1159 Class:
\helpref{wxQueryCol
}{wxquerycol
}
1161 \wxheading{DEPRECATED
}
1163 Use
\helpref{wxDb
}{wxdb
} and
\helpref{wxDbTable
}{wxdbtable
} instead.
1165 Every data column is represented by an instance of this class.
1166 It contains the name and type of a column and a list of wxQueryFields where
1167 the real data is stored. The links to user-defined variables are stored
1170 \wxheading{See also
}
1172 \helpref{Database classes overview
}{odbcoverview
}
1174 \subsection{wxQueryField class overview
[DEPRECATED
]}\label{wxqueryfieldoverview
}
1176 Class:
\helpref{wxQueryField
}{wxqueryfield
}
1178 \wxheading{DEPRECATED
}
1180 Use
\helpref{wxDb
}{wxdb
} and
\helpref{wxDbTable
}{wxdbtable
} instead.
1182 As every data column is represented by an instance of the class wxQueryCol,
1183 every data item of a specific column is represented by an instance of
1184 wxQueryField. Each column contains a list of wxQueryFields. If wxRecordSet is
1185 of the type wxOPEN
\_TYPE\_DYNASET, there will be only one field for each column,
1186 which will be updated every time you call functions like wxRecordSet::Move
1187 or wxRecordSet::GoTo. If wxRecordSet is of the type wxOPEN
\_TYPE\_SNAPSHOT,
1188 all data returned by an ODBC function will be loaded at once and the number
1189 of wxQueryField instances for each column will depend on the number of records.
1191 \wxheading{See also
}
1193 \helpref{Database classes overview
}{odbcoverview
}
1195 \subsection{wxRecordSet overview
[DEPRECATED
]}\label{wxrecordsetoverview
}
1197 Class:
\helpref{wxRecordSet
}{wxrecordset
}
1199 \wxheading{DEPRECATED
}
1201 Use
\helpref{wxDb
}{wxdb
} and
\helpref{wxDbTable
}{wxdbtable
} instead.
1203 Each wxRecordSet represents a database query. You can make multiple queries
1204 at a time by using multiple wxRecordSets with a wxDatabase or you can make
1205 your queries in sequential order using the same wxRecordSet.
1207 \wxheading{See also
}
1209 \helpref{Database classes overview
}{odbcoverview
}
1211 \subsection{ODBC SQL data types
[DEPRECATED
]}\label{sqltypes
}
1213 These are the data types supported in ODBC SQL. Note that there are other, extended level conformance
1214 types, not currently supported in wxWindows.
1216 \begin{twocollist
}\itemsep=
0pt
1217 \twocolitem{CHAR(n)
}{A character string of fixed length
{\it n
}.
}
1218 \twocolitem{VARCHAR(n)
}{A varying length character string of maximum length
{\it n
}.
}
1219 \twocolitem{LONG VARCHAR(n)
}{A varying length character string: equivalent to VARCHAR for the purposes
1221 \twocolitem{DECIMAL(p, s)
}{An exact numeric of precision
{\it p
} and scale
{\it s
}.
}
1222 \twocolitem{NUMERIC(p, s)
}{Same as DECIMAL.
}
1223 \twocolitem{SMALLINT
}{A
2 byte integer.
}
1224 \twocolitem{INTEGER
}{A
4 byte integer.
}
1225 \twocolitem{REAL
}{A
4 byte floating point number.
}
1226 \twocolitem{FLOAT
}{An
8 byte floating point number.
}
1227 \twocolitem{DOUBLE PRECISION
}{Same as FLOAT.
}
1230 These data types correspond to the following ODBC identifiers:
1232 \begin{twocollist
}\itemsep=
0pt
1233 \twocolitem{SQL
\_CHAR}{A character string of fixed length.
}
1234 \twocolitem{SQL
\_VARCHAR}{A varying length character string.
}
1235 \twocolitem{SQL
\_DECIMAL}{An exact numeric.
}
1236 \twocolitem{SQL
\_NUMERIC}{Same as SQL
\_DECIMAL.
}
1237 \twocolitem{SQL
\_SMALLINT}{A
2 byte integer.
}
1238 \twocolitem{SQL
\_INTEGER}{A
4 byte integer.
}
1239 \twocolitem{SQL
\_REAL}{A
4 byte floating point number.
}
1240 \twocolitem{SQL
\_FLOAT}{An
8 byte floating point number.
}
1241 \twocolitem{SQL
\_DOUBLE}{Same as SQL
\_FLOAT.
}
1244 \wxheading{See also
}
1246 \helpref{Database classes overview
}{odbcoverview
}
1248 \subsection{A selection of SQL commands
[DEPRECATED
]}\label{sqlcommands
}
1250 The following is a very brief description of some common SQL commands, with
1253 \wxheading{See also
}
1255 \helpref{Database classes overview
}{odbcoverview
}
1257 \subsubsection{Create
}
1265 (BookNumber INTEGER PRIMARY KEY
1266 , CategoryCode CHAR(
2) DEFAULT 'RO' NOT NULL
1267 , Title VARCHAR(
100) UNIQUE
1268 , NumberOfPages SMALLINT
1269 , RetailPriceAmount NUMERIC(
5,
2)
1273 \subsubsection{Insert
}
1275 Inserts records into a table.
1281 (BookNumber, CategoryCode, Title)
1282 VALUES(
5, 'HR', 'The Lark Ascending')
1285 \subsubsection{Select
}
1287 The Select operation retrieves rows and columns from a table. The criteria
1288 for selection and the columns returned may be specified.
1292 {\tt SELECT * FROM Book
}
1294 Selects all rows and columns from table Book.
1296 {\tt SELECT Title, RetailPriceAmount FROM Book WHERE RetailPriceAmount >
20.0}
1298 Selects columns Title and RetailPriceAmount from table Book, returning only
1299 the rows that match the WHERE clause.
1301 {\tt SELECT * FROM Book WHERE CatCode = 'LL' OR CatCode = 'RR'
}
1303 Selects all columns from table Book, returning only
1304 the rows that match the WHERE clause.
1306 {\tt SELECT * FROM Book WHERE CatCode IS NULL
}
1308 Selects all columns from table Book, returning only rows where the CatCode column
1311 {\tt SELECT * FROM Book ORDER BY Title
}
1313 Selects all columns from table Book, ordering by Title, in ascending order. To specify
1314 descending order, add DESC after the ORDER BY Title clause.
1316 {\tt SELECT Title FROM Book WHERE RetailPriceAmount >=
20.0 AND RetailPriceAmount <=
35.0}
1318 Selects records where RetailPriceAmount conforms to the WHERE expression.
1320 \subsubsection{Update
}
1322 Updates records in a table.
1326 {\tt UPDATE Incident SET X =
123 WHERE ASSET = 'BD34'
}
1328 This example sets a field in column `X' to the number
123, for the record
1329 where the column ASSET has the value `BD34'.