]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/db/dbtest.cpp
fixed typo
[wxWidgets.git] / samples / db / dbtest.cpp
index 89b4c14ffb413bac32b3d208481d39c32e23f40b..dbae3482f06c74bb6662038631297543a2d529d5 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Name:        dbtest.cpp
-// Purpose:     wxWindows database demo app
+// Purpose:     wxWidgets database demo app
 // Author:      George Tasker
 // Modified by:
 // Created:     1998
 #endif  //__BORLANDC__
 
 #ifndef WX_PRECOMP
-#include  <wx/wx.h>
+#include  "wx/wx.h"
 #endif //WX_PRECOMP
 
-#ifdef __WXGTK__
+#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMAC__)
 #include "db.xpm"
 #endif
 
 #include <stdio.h>                  /* Included strictly for reading the text file with the database parameters */
 
-//#include <wx/db.h>                  /* Required in the file which will get the data source connection */
-//#include <wx/dbtable.h>             /* Has the wxDbTable object from which all data objects will inherit their data table functionality */
+//#include "wx/db.h"                  /* Required in the file which will get the data source connection */
+//#include "wx/dbtable.h"             /* Has the wxDbTable object from which all data objects will inherit their data table functionality */
 
 //extern wxDbList WXDLLEXPORT *PtrBegDbList;    /* from db.cpp, used in getting back error results from db connections */
 
+#if wxUSE_GRID
+#include "wx/grid.h"
+#include "wx/generic/gridctrl.h"
+#include "wx/dbgrid.h"
+
+#define CHOICEINT
+#endif
+
 #include "dbtest.h"                 /* Header file for this demonstration program */
 #include "listdb.h"                 /* Code to support the "Lookup" button on the editor dialog */
 
@@ -60,54 +68,18 @@ extern wxChar ListDB_Selection2[];  /* Used to return the second column value fo
 #endif
 
 
-const char *GetExtendedDBErrorMsg(wxDb *pDb, char *ErrFile, int ErrLine)
-{
-    static wxString msg;
-    msg = wxT("");
-
-    wxString tStr;
-
-    if (ErrFile || ErrLine)
-    {
-        msg += wxT("File: ");
-        msg += ErrFile;
-        msg += wxT("   Line: ");
-        tStr.Printf(wxT("%d"),ErrLine);
-        msg += tStr.c_str();
-        msg += wxT("\n");
-    }
-
-    msg.Append (wxT("\nODBC errors:\n"));
-    msg += wxT("\n");
-    
-    // Display errors for this connection
-    int i;
-    for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
-    {
-        if (pDb->errorList[i])
-        {
-            msg.Append(pDb->errorList[i]);
-            if (wxStrcmp(pDb->errorList[i],wxT("")) != 0)
-                msg.Append(wxT("\n"));
-            // Clear the errmsg buffer so the next error will not
-            // end up showing the previous error that have occurred
-            wxStrcpy(pDb->errorList[i],wxT(""));
-        }
-    }
-    msg += wxT("\n");
-
-    return msg.c_str();
-}  // GetExtendedDBErrorMsg
-
-
-bool DataTypeSupported(wxDb *pDb, SWORD datatype)
+bool DataTypeSupported(wxDb *pDb, SWORD datatype, wxString *nativeDataTypeName)
 {
     wxDbSqlTypeInfo sqlTypeInfo;
 
-    bool breakpoint = FALSE;
+    bool breakpoint = false;
 
+    *nativeDataTypeName = wxEmptyString;
     if (pDb->GetDataTypeInfo(datatype, sqlTypeInfo))
-        breakpoint = TRUE;
+    {
+        *nativeDataTypeName = sqlTypeInfo.TypeName;
+        breakpoint = true;
+    }
 
     return breakpoint;
 
@@ -117,266 +89,520 @@ bool DataTypeSupported(wxDb *pDb, SWORD datatype)
 
 void CheckSupportForAllDataTypes(wxDb *pDb)
 {
-    wxLogMessage("\nThe following datatypes are supported by the\ndatabase you are currently connected to:");
+    wxString nativeDataTypeName;
+
+    wxLogMessage(wxT("\nThe following datatypes are supported by the\ndatabase you are currently connected to:"));
 #ifdef SQL_C_BINARY
-    if (DataTypeSupported(pDb,SQL_C_BINARY))
-        wxLogMessage("SQL_C_BINARY");
+    if (DataTypeSupported(pDb,SQL_C_BINARY, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_BINARY (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_BIT
-    if (DataTypeSupported(pDb,SQL_C_BIT))
-        wxLogMessage("SQL_C_BIT");
+    if (DataTypeSupported(pDb,SQL_C_BIT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_BIT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_BOOKMARK
-    if (DataTypeSupported(pDb,SQL_C_BOOKMARK))
-        wxLogMessage("SQL_C_BOOKMARK");
+    if (DataTypeSupported(pDb,SQL_C_BOOKMARK, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_BOOKMARK (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_CHAR
-    if (DataTypeSupported(pDb,SQL_C_CHAR))
-        wxLogMessage("SQL_C_CHAR");
+    if (DataTypeSupported(pDb,SQL_C_CHAR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_CHAR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_DATE
-    if (DataTypeSupported(pDb,SQL_C_DATE))
-        wxLogMessage("SQL_C_DATE");
+    if (DataTypeSupported(pDb,SQL_C_DATE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_DATE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_DEFAULT
-    if (DataTypeSupported(pDb,SQL_C_DEFAULT))
-        wxLogMessage("SQL_C_DEFAULT");
+    if (DataTypeSupported(pDb,SQL_C_DEFAULT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_DEFAULT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_DOUBLE
-    if (DataTypeSupported(pDb,SQL_C_DOUBLE))
-        wxLogMessage("SQL_C_DOUBLE");
+    if (DataTypeSupported(pDb,SQL_C_DOUBLE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_DOUBLE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_FLOAT
-    if (DataTypeSupported(pDb,SQL_C_FLOAT))
-        wxLogMessage("SQL_C_FLOAT");
+    if (DataTypeSupported(pDb,SQL_C_FLOAT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_FLOAT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_GUID
-    if (DataTypeSupported(pDb,SQL_C_GUID))
-        wxLogMessage("SQL_C_GUID");
+    if (DataTypeSupported(pDb,SQL_C_GUID, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_GUID (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_DAY
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY))
-        wxLogMessage("SQL_C_INTERVAL_DAY");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_DAY_TO_HOUR
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_HOUR))
-        wxLogMessage("SQL_C_INTERVAL_DAY_TO_HOUR");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_HOUR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY_TO_HOUR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_DAY_TO_MINUTE
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_MINUTE))
-        wxLogMessage("SQL_C_INTERVAL_DAY_TO_MINUTE");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_MINUTE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY_TO_MINUTE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_DAY_TO_SECOND
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_SECOND))
-        wxLogMessage("SQL_C_INTERVAL_DAY_TO_SECOND");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_DAY_TO_SECOND, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_DAY_TO_SECOND (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_HOUR
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR))
-        wxLogMessage("SQL_C_INTERVAL_HOUR");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_HOUR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_HOUR_TO_MINUTE
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR_TO_MINUTE))
-        wxLogMessage("SQL_C_INTERVAL_HOUR_TO_MINUTE");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR_TO_MINUTE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_HOUR_TO_MINUTE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_HOUR_TO_SECOND
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR_TO_SECOND))
-        wxLogMessage("SQL_C_INTERVAL_HOUR_TO_SECOND");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_HOUR_TO_SECOND, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_HOUR_TO_SECOND (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_MINUTE
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_MINUTE))
-        wxLogMessage("SQL_C_INTERVAL_MINUTE");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_MINUTE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_MINUTE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_MINUTE_TO_SECOND
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_MINUTE_TO_SECOND))
-        wxLogMessage("SQL_C_INTERVAL_MINUTE_TO_SECOND");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_MINUTE_TO_SECOND, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_MINUTE_TO_SECOND (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_MONTH
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_MONTH))
-        wxLogMessage("SQL_C_INTERVAL_MONTH");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_MONTH, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_MONTH (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_SECOND
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_SECOND))
-        wxLogMessage("SQL_C_INTERVAL_SECOND");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_SECOND, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_SECOND (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_YEAR
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_YEAR))
-        wxLogMessage("SQL_C_INTERVAL_YEAR");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_YEAR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_YEAR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_INTERVAL_YEAR_TO_MONTH
-    if (DataTypeSupported(pDb,SQL_C_INTERVAL_YEAR_TO_MONTH))
-        wxLogMessage("SQL_C_INTERVAL_YEAR_TO_MONTH");
+    if (DataTypeSupported(pDb,SQL_C_INTERVAL_YEAR_TO_MONTH, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_INTERVAL_YEAR_TO_MONTH (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_LONG
-    if (DataTypeSupported(pDb,SQL_C_LONG))
-        wxLogMessage("SQL_C_LONG");
+    if (DataTypeSupported(pDb,SQL_C_LONG, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_LONG (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_NUMERIC
-    if (DataTypeSupported(pDb,SQL_C_NUMERIC))
-        wxLogMessage("SQL_C_NUMERIC");
+    if (DataTypeSupported(pDb,SQL_C_NUMERIC, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_NUMERIC (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_SBIGINT
-    if (DataTypeSupported(pDb,SQL_C_SBIGINT))
-        wxLogMessage("SQL_C_SBIGINT");
+    if (DataTypeSupported(pDb,SQL_C_SBIGINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_SBIGINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_SHORT
-    if (DataTypeSupported(pDb,SQL_C_SHORT))
-        wxLogMessage("SQL_C_SHORT");
+    if (DataTypeSupported(pDb,SQL_C_SHORT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_SHORT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_SLONG
-    if (DataTypeSupported(pDb,SQL_C_SLONG))
-        wxLogMessage("SQL_C_SLONG");
+    if (DataTypeSupported(pDb,SQL_C_SLONG, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_SLONG (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_SSHORT
-    if (DataTypeSupported(pDb,SQL_C_SSHORT))
-        wxLogMessage("SQL_C_SSHORT");
+    if (DataTypeSupported(pDb,SQL_C_SSHORT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_SSHORT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_STINYINT
-    if (DataTypeSupported(pDb,SQL_C_STINYINT))
-        wxLogMessage("SQL_C_STINYINT");
+    if (DataTypeSupported(pDb,SQL_C_STINYINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_STINYINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_TIME
-    if (DataTypeSupported(pDb,SQL_C_TIME))
-        wxLogMessage("SQL_C_TIME");
+    if (DataTypeSupported(pDb,SQL_C_TIME, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_TIME (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_TIMESTAMP
-    if (DataTypeSupported(pDb,SQL_C_TIMESTAMP))
-        wxLogMessage("SQL_C_TIMESTAMP");
+    if (DataTypeSupported(pDb,SQL_C_TIMESTAMP, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_TIMESTAMP (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_TINYINT
-    if (DataTypeSupported(pDb,SQL_C_TINYINT))
-        wxLogMessage("SQL_C_TINYINT");
+    if (DataTypeSupported(pDb,SQL_C_TINYINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_TINYINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_TYPE_DATE
-    if (DataTypeSupported(pDb,SQL_C_TYPE_DATE))
-        wxLogMessage("SQL_C_TYPE_DATE");
+    if (DataTypeSupported(pDb,SQL_C_TYPE_DATE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_TYPE_DATE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_TYPE_TIME
-    if (DataTypeSupported(pDb,SQL_C_TYPE_TIME))
-        wxLogMessage("SQL_C_TYPE_TIME");
+    if (DataTypeSupported(pDb,SQL_C_TYPE_TIME, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_TYPE_TIME (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_TYPE_TIMESTAMP
-    if (DataTypeSupported(pDb,SQL_C_TYPE_TIMESTAMP))
-        wxLogMessage("SQL_C_TYPE_TIMESTAMP");
+    if (DataTypeSupported(pDb,SQL_C_TYPE_TIMESTAMP, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_TYPE_TIMESTAMP (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_UBIGINT
-    if (DataTypeSupported(pDb,SQL_C_UBIGINT))
-        wxLogMessage("SQL_C_UBIGINT");
+    if (DataTypeSupported(pDb,SQL_C_UBIGINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_UBIGINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_ULONG
-    if (DataTypeSupported(pDb,SQL_C_ULONG))
-        wxLogMessage("SQL_C_ULONG");
+    if (DataTypeSupported(pDb,SQL_C_ULONG, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_ULONG (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_USHORT
-    if (DataTypeSupported(pDb,SQL_C_USHORT))
-        wxLogMessage("SQL_C_USHORT");
+    if (DataTypeSupported(pDb,SQL_C_USHORT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_USHORT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_UTINYINT
-    if (DataTypeSupported(pDb,SQL_C_UTINYINT))
-        wxLogMessage("SQL_C_UTINYINT");
+    if (DataTypeSupported(pDb,SQL_C_UTINYINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_UTINYINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_C_VARBOOKMARK
-    if (DataTypeSupported(pDb,SQL_C_VARBOOKMARK))
-        wxLogMessage("SQL_C_VARBOOKMARK");
+    if (DataTypeSupported(pDb,SQL_C_VARBOOKMARK, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_VARBOOKMARK (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 
 // Extended SQL types
 #ifdef SQL_DATE
-    if (DataTypeSupported(pDb,SQL_DATE))
-        wxLogMessage("SQL_DATE");
+    if (DataTypeSupported(pDb,SQL_DATE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_DATE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_INTERVAL
-    if (DataTypeSupported(pDb,SQL_INTERVAL))
-        wxLogMessage("SQL_INTERVAL");
+    if (DataTypeSupported(pDb,SQL_INTERVAL, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_INTERVAL (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_TIME
-    if (DataTypeSupported(pDb,SQL_TIME))
-        wxLogMessage("SQL_TIME");
+    if (DataTypeSupported(pDb,SQL_TIME, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_TIME (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_TIMESTAMP
-    if (DataTypeSupported(pDb,SQL_TIMESTAMP))
-        wxLogMessage("SQL_TIMESTAMP");
+    if (DataTypeSupported(pDb,SQL_TIMESTAMP, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_TIMESTAMP (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_LONGVARCHAR
-    if (DataTypeSupported(pDb,SQL_LONGVARCHAR))
-        wxLogMessage("SQL_LONGVARCHAR");
+    if (DataTypeSupported(pDb,SQL_LONGVARCHAR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_LONGVARCHAR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_BINARY
-    if (DataTypeSupported(pDb,SQL_BINARY))
-        wxLogMessage("SQL_BINARY");
+    if (DataTypeSupported(pDb,SQL_BINARY, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_BINARY (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_VARBINARY
-    if (DataTypeSupported(pDb,SQL_VARBINARY))
-        wxLogMessage("SQL_VARBINARY");
+    if (DataTypeSupported(pDb,SQL_VARBINARY, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_VARBINARY (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_LONGVARBINARY
-    if (DataTypeSupported(pDb,SQL_LONGVARBINARY))
-        wxLogMessage("SQL_LONGVARBINARY");
+    if (DataTypeSupported(pDb,SQL_LONGVARBINARY, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_LOGVARBINARY (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_BIGINT
-    if (DataTypeSupported(pDb,SQL_BIGINT))
-        wxLogMessage("SQL_BIGINT");
+    if (DataTypeSupported(pDb,SQL_BIGINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_BIGINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_TINYINT
-    if (DataTypeSupported(pDb,SQL_TINYINT))
-        wxLogMessage("SQL_TINYINT");
+    if (DataTypeSupported(pDb,SQL_TINYINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_TINYINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_BIT
-    if (DataTypeSupported(pDb,SQL_BIT))
-        wxLogMessage("SQL_BIT");
+    if (DataTypeSupported(pDb,SQL_BIT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_BIT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_GUID
-    if (DataTypeSupported(pDb,SQL_GUID))
-        wxLogMessage("SQL_GUID");
+    if (DataTypeSupported(pDb,SQL_GUID, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_GUID (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 
 #ifdef SQL_CHAR
-    if (DataTypeSupported(pDb,SQL_CHAR))
-        wxLogMessage("SQL_CHAR");
+    if (DataTypeSupported(pDb,SQL_CHAR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_CHAR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_INTEGER
-    if (DataTypeSupported(pDb,SQL_INTEGER))
-        wxLogMessage("SQL_INTEGER");
+    if (DataTypeSupported(pDb,SQL_INTEGER, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_INTEGER (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_SMALLINT
-    if (DataTypeSupported(pDb,SQL_SMALLINT))
-        wxLogMessage("SQL_SMALLINT");
+    if (DataTypeSupported(pDb,SQL_SMALLINT, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_SAMLLINT (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_REAL
-    if (DataTypeSupported(pDb,SQL_REAL))
-        wxLogMessage("SQL_REAL");
+    if (DataTypeSupported(pDb,SQL_REAL, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_REAL (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_DOUBLE
-    if (DataTypeSupported(pDb,SQL_DOUBLE))
-        wxLogMessage("SQL_DOUBLE");
+    if (DataTypeSupported(pDb,SQL_DOUBLE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_DOUBLE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_NUMERIC
-    if (DataTypeSupported(pDb,SQL_NUMERIC))
-        wxLogMessage("SQL_NUMERIC");
+    if (DataTypeSupported(pDb,SQL_NUMERIC, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_NUMERIC (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_DATE
-    if (DataTypeSupported(pDb,SQL_DATE))
-        wxLogMessage("SQL_DATE");
+    if (DataTypeSupported(pDb,SQL_DATE, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_DATE (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_TIME
-    if (DataTypeSupported(pDb,SQL_TIME))
-        wxLogMessage("SQL_TIME");
+    if (DataTypeSupported(pDb,SQL_TIME, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_TIME (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_TIMESTAMP
-    if (DataTypeSupported(pDb,SQL_TIMESTAMP))
-        wxLogMessage("SQL_TIMESTAMP");
+    if (DataTypeSupported(pDb,SQL_TIMESTAMP, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_TIMESTAMP (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 #ifdef SQL_VARCHAR
-    if (DataTypeSupported(pDb,SQL_VARCHAR))
-        wxLogMessage("SQL_VARCHAR");
+    if (DataTypeSupported(pDb,SQL_VARCHAR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_VARCHAR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 
 // UNICODE
 #ifdef SQL_C_TCHAR
-    if (DataTypeSupported(pDb,SQL_C_TCHAR))
-        wxLogMessage("SQL_C_TCHAR (Unicode support is possible)");
+    if (DataTypeSupported(pDb,SQL_C_TCHAR, &nativeDataTypeName))
+    {
+        nativeDataTypeName = wxT("SQL_C_TCHAR (") + nativeDataTypeName;
+        nativeDataTypeName += wxT(")\n");
+        wxLogMessage(nativeDataTypeName);
+    }
 #endif
 
-    wxLogMessage("\n");
+    wxLogMessage(wxT("Done\n"));
 }  // CheckSupportForAllDataTypes()
 
 
@@ -386,16 +612,19 @@ bool DatabaseDemoApp::OnInit()
     Contact         = NULL;
 
     // Create the main frame window
-    DemoFrame = new DatabaseDemoFrame(NULL, wxT("wxWindows Database Demo"), wxPoint(50, 50), wxSize(537, 480));
+    DemoFrame = new DatabaseDemoFrame(NULL, wxT("wxWidgets Database Demo"), wxPoint(50, 50), wxSize(537, 480));
 
     // Give it an icon
     DemoFrame->SetIcon(wxICON(db));
 
     // Make a menubar
     wxMenu *file_menu = new wxMenu;
-    file_menu->Append(FILE_CREATE, wxT("&Create CONTACT table"));
+    file_menu->Append(FILE_CREATE_ID, wxT("&Create CONTACT table"));
     file_menu->Append(FILE_RECREATE_TABLE, wxT("&Recreate CONTACT table"));
     file_menu->Append(FILE_RECREATE_INDEXES, wxT("&Recreate CONTACT indexes"));
+#if wxUSE_GRID
+    file_menu->Append(FILE_DBGRID_TABLE,  wxT("&Open DB Grid example"));
+#endif
     file_menu->Append(FILE_EXIT, wxT("E&xit"));
 
     wxMenu *edit_menu = new wxMenu;
@@ -416,7 +645,7 @@ bool DatabaseDemoApp::OnInit()
     params.DirPath[0]    = 0;
 
     // Show the frame
-    DemoFrame->Show(TRUE);
+    DemoFrame->Show(true);
 
     // Passing NULL for the SQL environment handle causes
     // the wxDbConnectInf constructor to obtain a handle
@@ -440,7 +669,7 @@ bool DatabaseDemoApp::OnInit()
     if (!wxStrlen(params.ODBCSource))
     {
         wxDELETE(DbConnectInf);
-        return(FALSE);
+        return(false);
     }
 
     DbConnectInf->SetDsn(params.ODBCSource);
@@ -455,7 +684,7 @@ bool DatabaseDemoApp::OnInit()
         DemoFrame->BuildParameterDialog(NULL);
         wxDELETE(DbConnectInf);
         wxMessageBox(wxT("Now exiting program.\n\nRestart program to try any new settings."),wxT("Notice..."),wxOK | wxICON_INFORMATION);
-        return(FALSE);
+        return(false);
     }
 
     DemoFrame->BuildEditorDialog();
@@ -463,73 +692,87 @@ bool DatabaseDemoApp::OnInit()
     // Show the frame
     DemoFrame->Refresh();
 
-    return TRUE;
+    return true;
 }  // DatabaseDemoApp::OnInit()
 
 
+/*
+* Remove CR or CR/LF from a character string.
+*/
+wxChar* wxRemoveLineTerminator(wxChar* aString)
+{
+    int len = wxStrlen(aString);
+    while (len > 0 && (aString[len-1] == wxT('\r') || aString[len-1] == wxT('\n'))) {
+        aString[len-1] = wxT('\0');
+        len--;
+    }
+    return aString;
+}
+
+
 bool DatabaseDemoApp::ReadParamFile(Cparameters &params)
 {
     FILE *paramFile;
-    if ((paramFile = fopen(PARAM_FILENAME, wxT("r"))) == NULL)
+    if ((paramFile = wxFopen(PARAM_FILENAME, wxT("r"))) == NULL)
     {
         wxString tStr;
         tStr.Printf(wxT("Unable to open the parameter file '%s' for reading.\n\nYou must specify the data source, user name, and\npassword that will be used and save those settings."),PARAM_FILENAME);
         wxMessageBox(tStr,wxT("File I/O Error..."),wxOK | wxICON_EXCLAMATION);
 
-        return FALSE;
+        return false;
     }
 
     wxChar buffer[1000+1];
-    fgets(buffer, sizeof(params.ODBCSource), paramFile);
-    buffer[wxStrlen(buffer)-1] = wxT('\0');
+    wxFgets(buffer, sizeof(params.ODBCSource), paramFile);
+    wxRemoveLineTerminator(buffer);
     wxStrcpy(params.ODBCSource,buffer);
 
-    fgets(buffer, sizeof(params.UserName), paramFile);
-    buffer[wxStrlen(buffer)-1] = wxT('\0');
+    wxFgets(buffer, sizeof(params.UserName), paramFile);
+    wxRemoveLineTerminator(buffer);
     wxStrcpy(params.UserName,buffer);
 
-    fgets(buffer, sizeof(params.Password), paramFile);
-    buffer[wxStrlen(buffer)-1] = wxT('\0');
+    wxFgets(buffer, sizeof(params.Password), paramFile);
+    wxRemoveLineTerminator(buffer);
     wxStrcpy(params.Password,buffer);
 
-    fgets(buffer, sizeof(params.DirPath), paramFile);
-    buffer[wxStrlen(buffer)-1] = wxT('\0');
+    wxFgets(buffer, sizeof(params.DirPath), paramFile);
+    wxRemoveLineTerminator(buffer);
     wxStrcpy(params.DirPath,buffer);
 
     fclose(paramFile);
 
-    return TRUE;
+    return true;
 }  // DatabaseDemoApp::ReadParamFile()
 
 
-bool DatabaseDemoApp::WriteParamFile(Cparameters &params)
+bool DatabaseDemoApp::WriteParamFile(Cparameters &WXUNUSED(params))
 {
     FILE *paramFile;
-    if ((paramFile = fopen(PARAM_FILENAME, wxT("wt"))) == NULL)
+    if ((paramFile = wxFopen(PARAM_FILENAME, wxT("wt"))) == NULL)
     {
         wxString tStr;
         tStr.Printf(wxT("Unable to write/overwrite '%s'."),PARAM_FILENAME);
         wxMessageBox(tStr,wxT("File I/O Error..."),wxOK | wxICON_EXCLAMATION);
-        return FALSE;
+        return false;
     }
 
-    fputs(wxGetApp().params.ODBCSource, paramFile);
-    fputc(wxT('\n'), paramFile);
-    fputs(wxGetApp().params.UserName, paramFile);
-    fputc(wxT('\n'), paramFile);
-    fputs(wxGetApp().params.Password, paramFile);
-    fputc(wxT('\n'), paramFile);
-    fputs(wxGetApp().params.DirPath, paramFile);
-    fputc(wxT('\n'), paramFile);
+    wxFputs(wxGetApp().params.ODBCSource, paramFile);
+    wxFputc(wxT('\n'), paramFile);
+    wxFputs(wxGetApp().params.UserName, paramFile);
+    wxFputc(wxT('\n'), paramFile);
+    wxFputs(wxGetApp().params.Password, paramFile);
+    wxFputc(wxT('\n'), paramFile);
+    wxFputs(wxGetApp().params.DirPath, paramFile);
+    wxFputc(wxT('\n'), paramFile);
     fclose(paramFile);
 
-    return TRUE;
+    return true;
 }  // DatabaseDemoApp::WriteParamFile()
 
 
 void DatabaseDemoApp::CreateDataTable(bool recreate)
 {
-    bool Ok = TRUE;
+    bool Ok = true;
     if (recreate)
        Ok = (wxMessageBox(wxT("Any data currently residing in the table will be erased.\n\nAre you sure?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
 
@@ -538,7 +781,7 @@ void DatabaseDemoApp::CreateDataTable(bool recreate)
 
     wxBeginBusyCursor();
 
-    bool success = TRUE;
+    bool success = true;
 
     Contact->GetDb()->RollbackTrans();  // Make sure the current cursor is in a known/stable state
 
@@ -546,21 +789,23 @@ void DatabaseDemoApp::CreateDataTable(bool recreate)
     {
         wxEndBusyCursor();
         wxString tStr;
-        tStr  = wxT("Error creating CONTACTS table.\nTable was not created.\n\n");
-        tStr += GetExtendedDBErrorMsg(Contact->GetDb(),__FILE__,__LINE__);
-        wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
-        success = FALSE;
+        tStr = wxT("Error creating CONTACTS table.\nTable was not created.\n\n");
+        wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),Contact->GetDb(),__TFILE__,__LINE__),
+                     wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
+        success = false;
     }
     else
     {
-        if (!Contact->CreateIndexes())
+        if (!Contact->CreateIndexes(recreate))
         {
             wxEndBusyCursor();
             wxString tStr;
-            tStr  = wxT("Error creating CONTACTS indexes.\nIndexes will be unavailable.\n\n");
-            tStr += GetExtendedDBErrorMsg(Contact->GetDb(),__FILE__,__LINE__);
-            wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
-            success = FALSE;
+            tStr = wxT("Error creating CONTACTS indexes.\nIndexes will be unavailable.\n\n");
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
+            success = false;
         }
     }
     while (wxIsBusy())
@@ -572,9 +817,12 @@ void DatabaseDemoApp::CreateDataTable(bool recreate)
 
 
 BEGIN_EVENT_TABLE(DatabaseDemoFrame, wxFrame)
-    EVT_MENU(FILE_CREATE, DatabaseDemoFrame::OnCreate)
+    EVT_MENU(FILE_CREATE_ID, DatabaseDemoFrame::OnCreate)
     EVT_MENU(FILE_RECREATE_TABLE, DatabaseDemoFrame::OnRecreateTable)
     EVT_MENU(FILE_RECREATE_INDEXES, DatabaseDemoFrame::OnRecreateIndexes)
+#if wxUSE_GRID
+    EVT_MENU(FILE_DBGRID_TABLE, DatabaseDemoFrame::OnDbGridTable)
+#endif
     EVT_MENU(FILE_EXIT, DatabaseDemoFrame::OnExit)
     EVT_MENU(EDIT_PARAMETERS, DatabaseDemoFrame::OnEditParameters)
     EVT_MENU(HELP_ABOUT, DatabaseDemoFrame::OnAbout)
@@ -585,58 +833,76 @@ END_EVENT_TABLE()
 // DatabaseDemoFrame constructor
 DatabaseDemoFrame::DatabaseDemoFrame(wxFrame *frame, const wxString& title,
                                      const wxPoint& pos, const wxSize& size):
-                                        wxFrame(frame, -1, title, pos, size)
+                                        wxFrame(frame, wxID_ANY, title, pos, size)
 {
     // Put any code in necessary for initializing the main frame here
     pEditorDlg = NULL;
     pParamDlg  = NULL;
 
+#if wxUSE_LOG
     delete wxLog::SetActiveTarget(new wxLogStderr);
+#endif // wxUSE_LOG
 
 }  // DatabaseDemoFrame constructor
 
 DatabaseDemoFrame::~DatabaseDemoFrame()
 {
+#if wxUSE_LOG
     delete wxLog::SetActiveTarget(NULL);
+#endif // wxUSE_LOG
 }  // DatabaseDemoFrame destructor
 
 
-void DatabaseDemoFrame::OnCreate(wxCommandEvent& event)
+void DatabaseDemoFrame::OnCreate(wxCommandEvent& WXUNUSED(event))
 {
-    wxGetApp().CreateDataTable(FALSE);
+    wxGetApp().CreateDataTable(false);
 }  // DatabaseDemoFrame::OnCreate()
 
 
-void DatabaseDemoFrame::OnRecreateTable(wxCommandEvent& event)
+void DatabaseDemoFrame::OnRecreateTable(wxCommandEvent& WXUNUSED(event))
 {
-    wxGetApp().CreateDataTable(TRUE);
+    wxGetApp().CreateDataTable(true);
 }  // DatabaseDemoFrame::OnRecreate()
 
 
-void DatabaseDemoFrame::OnRecreateIndexes(wxCommandEvent& event)
+void DatabaseDemoFrame::OnRecreateIndexes(wxCommandEvent& WXUNUSED(event))
 {
-    if (!wxGetApp().Contact->CreateIndexes())
+    wxGetApp().Contact->GetDb()->RollbackTrans();  // Make sure the current cursor is in a known/stable state
+
+    if (!wxGetApp().Contact->CreateIndexes(true))
     {
         while (wxIsBusy())
             wxEndBusyCursor();
         wxString tStr;
-        tStr  = wxT("Error creating CONTACTS indexes.\nNew indexes will be unavailable.\n\n");
-        tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-        wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+        tStr = wxT("Error creating CONTACTS indexes.\nNew indexes will be unavailable.\n\n");
+        wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                     wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
     }
-        else
+     else
         wxMessageBox(wxT("Index(es) were successfully recreated."),wxT("Notice..."),wxOK | wxICON_INFORMATION);
 
 }  // DatabaseDemoFrame::OnRecreateIndexes()
 
 
-void DatabaseDemoFrame::OnExit(wxCommandEvent& event)
+#if wxUSE_GRID
+void DatabaseDemoFrame::OnDbGridTable(wxCommandEvent& WXUNUSED(event))
+{
+    DbGridFrame *frame = new DbGridFrame(this);
+    if (frame->Initialize())
+    {
+        frame->Show();
+    }
+}
+#endif
+
+void DatabaseDemoFrame::OnExit(wxCommandEvent& WXUNUSED(event))
 {
     Close();
 }  // DatabaseDemoFrame::OnExit()
 
 
-void DatabaseDemoFrame::OnEditParameters(wxCommandEvent& event)
+void DatabaseDemoFrame::OnEditParameters(wxCommandEvent& WXUNUSED(event))
 {
     if ((pEditorDlg->mode != mCreate) && (pEditorDlg->mode != mEdit))
         BuildParameterDialog(this);
@@ -645,9 +911,9 @@ void DatabaseDemoFrame::OnEditParameters(wxCommandEvent& event)
 }  // DatabaseDemoFrame::OnEditParameters()
 
 
-void DatabaseDemoFrame::OnAbout(wxCommandEvent& event)
+void DatabaseDemoFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 {
-    wxMessageBox(wxT("wxWindows sample program for database classes\n\nContributed on 27 July 1998"),wxT("About..."),wxOK | wxICON_INFORMATION);
+    wxMessageBox(wxT("wxWidgets sample program for database classes\n\nContributed on 27 July 1998"),wxT("About..."),wxOK | wxICON_INFORMATION);
 }  // DatabaseDemoFrame::OnAbout()
 
 
@@ -762,9 +1028,10 @@ void Ccontact::Initialize()
     JoinDate.second    = 0;
     JoinDate.fraction  = 0;
     NativeLanguage     = langENGLISH;
-    IsDeveloper        = FALSE;
+    IsDeveloper        = false;
     Contributions      = 0;
     LinesOfCode        = 0L;
+    Picture[0]         = 0;
 }  // Ccontact::Initialize
 
 
@@ -775,9 +1042,10 @@ Ccontact::~Ccontact()
         if (!wxDbFreeConnection(GetDb()))
         {
             wxString tStr;
-            tStr  = wxT("Unable to Free the Ccontact data table handle\n\n");
-            tStr += GetExtendedDBErrorMsg(GetDb(),__FILE__,__LINE__);
-            wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+            tStr = wxT("Unable to Free the Ccontact data table handle\n\n");
+
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
         }
     }
 }  // Ccontract destructor
@@ -788,48 +1056,46 @@ Ccontact::~Ccontact()
  * functions to interface to the data structure used to store records in 
  * memory, and for all the column definitions that define the table structure
  */
-void Ccontact::SetupColumns() 
+void Ccontact::SetupColumns()
 {
     // NOTE: Columns now are 8 character names, as that is all dBase can support.  Longer
     //       names can be used for other database engines
-    SetColDefs ( 0,wxT("NAME"),       DB_DATA_TYPE_VARCHAR,     Name,           SQL_C_CHAR,                 sizeof(Name),           TRUE, TRUE);  // Primary index
-    SetColDefs ( 1,wxT("ADDRESS1"),   DB_DATA_TYPE_VARCHAR,     Addr1,          SQL_C_CHAR,                 sizeof(Addr1),          FALSE,TRUE);
-    SetColDefs ( 2,wxT("ADDRESS2"),   DB_DATA_TYPE_VARCHAR,     Addr2,          SQL_C_CHAR,                 sizeof(Addr2),          FALSE,TRUE);
-    SetColDefs ( 3,wxT("CITY"),       DB_DATA_TYPE_VARCHAR,     City,           SQL_C_CHAR,                 sizeof(City),           FALSE,TRUE);
-    SetColDefs ( 4,wxT("STATE"),      DB_DATA_TYPE_VARCHAR,     State,          SQL_C_CHAR,                 sizeof(State),          FALSE,TRUE);
-    SetColDefs ( 5,wxT("POSTCODE"),   DB_DATA_TYPE_VARCHAR,     PostalCode,     SQL_C_CHAR,                 sizeof(PostalCode),     FALSE,TRUE);
-    SetColDefs ( 6,wxT("COUNTRY"),    DB_DATA_TYPE_VARCHAR,     Country,        SQL_C_CHAR,                 sizeof(Country),        FALSE,TRUE);
-    SetColDefs ( 7,wxT("JOINDATE"),   DB_DATA_TYPE_DATE,       &JoinDate,       SQL_C_TIMESTAMP,            sizeof(JoinDate),       FALSE,TRUE);
-    SetColDefs ( 8,wxT("IS_DEV"),     DB_DATA_TYPE_INTEGER,    &IsDeveloper,    SQL_C_BOOLEAN(IsDeveloper), sizeof(IsDeveloper),    FALSE,TRUE);
-    SetColDefs ( 9,wxT("CONTRIBS"),   DB_DATA_TYPE_INTEGER,    &Contributions,  SQL_C_USHORT,               sizeof(Contributions),  FALSE,TRUE);
-    SetColDefs (10,wxT("LINE_CNT"),   DB_DATA_TYPE_INTEGER,    &LinesOfCode,    SQL_C_ULONG,                sizeof(LinesOfCode),    FALSE,TRUE);
-    SetColDefs (11,wxT("LANGUAGE"),   DB_DATA_TYPE_INTEGER,    &NativeLanguage, SQL_C_ENUM,                 sizeof(NativeLanguage), FALSE,TRUE);
-#if wxODBC_BLOB_EXPERIMENT > 0
-    SetColDefs (12,wxT("PICTURE"),    DB_DATA_TYPE_BLOB,        Picture,        SQL_LONGVARBINARY,          sizeof(Picture),        FALSE,TRUE);
+    SetColDefs ( 0,wxT("NAME"),       DB_DATA_TYPE_VARCHAR,     Name,           SQL_C_CHAR,                 sizeof(Name),           true, true);  // Primary index
+    SetColDefs ( 1,wxT("ADDRESS1"),   DB_DATA_TYPE_VARCHAR,     Addr1,          SQL_C_CHAR,                 sizeof(Addr1),          false,true);
+    SetColDefs ( 2,wxT("ADDRESS2"),   DB_DATA_TYPE_VARCHAR,     Addr2,          SQL_C_CHAR,                 sizeof(Addr2),          false,true);
+    SetColDefs ( 3,wxT("CITY"),       DB_DATA_TYPE_VARCHAR,     City,           SQL_C_CHAR,                 sizeof(City),           false,true);
+    SetColDefs ( 4,wxT("STATE"),      DB_DATA_TYPE_VARCHAR,     State,          SQL_C_CHAR,                 sizeof(State),          false,true);
+    SetColDefs ( 5,wxT("POSTCODE"),   DB_DATA_TYPE_VARCHAR,     PostalCode,     SQL_C_CHAR,                 sizeof(PostalCode),     false,true);
+    SetColDefs ( 6,wxT("COUNTRY"),    DB_DATA_TYPE_VARCHAR,     Country,        SQL_C_CHAR,                 sizeof(Country),        false,true);
+    SetColDefs ( 7,wxT("JOINDATE"),   DB_DATA_TYPE_DATE,       &JoinDate,       SQL_C_TIMESTAMP,            sizeof(JoinDate),       false,true);
+    SetColDefs ( 8,wxT("IS_DEV"),     DB_DATA_TYPE_INTEGER,    &IsDeveloper,    SQL_C_BOOLEAN(IsDeveloper), sizeof(IsDeveloper),    false,true);
+    SetColDefs ( 9,wxT("CONTRIBS"),   DB_DATA_TYPE_INTEGER,    &Contributions,  SQL_C_UTINYINT,             sizeof(Contributions),  false,true);
+    SetColDefs (10,wxT("LINE_CNT"),   DB_DATA_TYPE_INTEGER,    &LinesOfCode,    SQL_C_ULONG,                sizeof(LinesOfCode),    false,true);
+    SetColDefs (11,wxT("LANGUAGE"),   DB_DATA_TYPE_INTEGER,    &NativeLanguage, SQL_C_ENUM,                 sizeof(NativeLanguage), false,true);
+#ifdef wxODBC_BLOB_SUPPORT
+    SetColDefs (12,wxT("PICTURE"),    DB_DATA_TYPE_BLOB,        Picture,        SQL_C_BINARY,               sizeof(Picture),        false,true);
 #endif
 }  // Ccontact::SetupColumns
 
 
-bool Ccontact::CreateIndexes(void)
+bool Ccontact::CreateIndexes(bool recreate)
 {
     // This index could easily be accomplished with an "orderBy" clause, 
     // but is done to show how to construct a non-primary index.
     wxString    indexName;
     wxDbIdxDef  idxDef[2];
 
-    bool        Ok = TRUE;
-
-    wxStrcpy(idxDef[0].ColName, "IS_DEV");
-    idxDef[0].Ascending = TRUE;
+    wxStrcpy(idxDef[0].ColName, wxT("IS_DEV"));
+    idxDef[0].Ascending = true;
 
-    wxStrcpy(idxDef[1].ColName, "NAME");
-    idxDef[1].Ascending = TRUE;
+    wxStrcpy(idxDef[1].ColName, wxT("NAME"));
+    idxDef[1].Ascending = true;
 
     indexName = GetTableName();
-    indexName += "_IDX1";
-    Ok = CreateIndex(indexName.c_str(), TRUE, 2, idxDef);
+    indexName += wxT("_IDX1");
+
+    return CreateIndex(indexName.c_str(), true, 2, idxDef, recreate);
 
-    return Ok;
 }  // Ccontact::CreateIndexes()
 
 
@@ -845,7 +1111,7 @@ bool Ccontact::FetchByName(const wxString &name)
     SetOrderByClause(wxT(""));
 
     if (!Query())
-        return(FALSE);
+        return(false);
 
     // Fetch the record
     return(GetNext());
@@ -870,7 +1136,7 @@ bool Ccontact::FetchByName(const wxString &name)
  */
  
 BEGIN_EVENT_TABLE(CeditorDlg, wxPanel)
-    EVT_BUTTON(-1,  CeditorDlg::OnButton)
+    EVT_BUTTON(wxID_ANY,  CeditorDlg::OnButton)
     EVT_CLOSE(CeditorDlg::OnCloseWindow)
 END_EVENT_TABLE()
  
@@ -879,13 +1145,13 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 0, 0, 537, 480)
     // Since the ::OnCommand() function is overridden, this prevents the widget
     // detection in ::OnCommand() until all widgets have been initialized to prevent
     // uninitialized pointers from crashing the program
-    widgetPtrsSet = FALSE;
+    widgetPtrsSet = false;
 
-    initialized = FALSE;
+    initialized = false;
 
     SetMode(mView);
 
-    Show(FALSE);
+    Show(false);
 }  // CeditorDlg constructor
 
 
@@ -911,7 +1177,7 @@ void CeditorDlg::OnButton(wxCommandEvent &event)
 }  // CeditorDlg::OnButton()
 
 
-void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
+void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& WXUNUSED(event))
 {
     wxString widgetName;
     
@@ -1031,9 +1297,10 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
         if (!wxGetApp().Contact->Query())
         {
             wxString tStr;
-            tStr  = wxT("ODBC error during Query()\n\n");
-            tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-            wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+            tStr = wxT("ODBC error during Query()\n\n");
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+            
             SetMode(mView);
             return;
         }
@@ -1077,7 +1344,7 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
         if (wxStrcmp(qryWhere, (const wxChar*) wxGetApp().Contact->qryWhereStr))
         {
             wxGetApp().Contact->whereStr.Empty();
-            wxGetApp().Contact->SetOrderByClause("NAME");
+            wxGetApp().Contact->SetOrderByClause(wxT("NAME"));
 
             if (wxGetApp().Contact->GetDb()->Dbms() != dbmsPOSTGRES &&
                 wxGetApp().Contact->GetDb()->Dbms() != dbmsMY_SQL)
@@ -1100,9 +1367,10 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
             if (!wxGetApp().Contact->Query())
             {
                 wxString tStr;
-                tStr  = wxT("ODBC error during Query()\n\n");
-                tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-                wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+                tStr = wxT("ODBC error during Query()\n\n");
+                wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                             wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
                 return;
             }
             // Display the first record from the query set
@@ -1136,15 +1404,15 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
         if (!wxGetApp().Contact->Query())
         {
             wxString tStr;
-            tStr  = wxT("ODBC error during Query()\n\n");
-            tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-            wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+            tStr = wxT("ODBC error during Query()\n\n");
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
             return;
         }
         if (!wxGetApp().Contact->GetNext())
             wxGetApp().Contact->Initialize();
         PutData();
-        pResetBtn->Enable(FALSE);
+        pResetBtn->Enable(false);
 
         return;
     }  // Reset button
@@ -1161,7 +1429,7 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
                        /* wxChar      *orderBy       */ wxT("NAME"),
                        /* wxDb        *pDb           */ wxGetApp().READONLY_DB,
                        /* const wxString &defDir     */ wxGetApp().DbConnectInf->GetDefaultDir(),
-                       /* bool        distinctValues */ TRUE);
+                       /* bool        distinctValues */ true);
 
         if (ListDB_Selection && wxStrlen(ListDB_Selection))
         {
@@ -1177,22 +1445,23 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
     if (widgetName == pDataTypesBtn->GetName())
     {
         CheckSupportForAllDataTypes(wxGetApp().READONLY_DB);
-
+        wxMessageBox(wxT("Support datatypes was dumped to stdout."));
         return;
     }  // Data types Button
 
     if (widgetName == pDbDiagsBtn->GetName())
     {
-/*
-strcpy(wxGetApp().Contact->Addr1,"12345678901234567890");
-//wxString sqlStmt = "UPDATE CONTACTS set ADDRESS1='1234567890ABCEFG' where NAME='12345'";
-//if (wxGetApp().Contact->GetDb()->ExecSql(sqlStmt))
-if (wxGetApp().Contact->UpdateWhere("NAME = '12345'"))
-wxGetApp().Contact->GetDb()->CommitTrans();
-else
-wxGetApp().Contact->GetDb()->RollbackTrans();
-*/
         DisplayDbDiagnostics(wxGetApp().READONLY_DB);
+        wxMessageBox(wxT("Diagnostics info was dumped to stdout."));
+        return;
+    }
+
+    if (widgetName == pCatalogBtn->GetName())
+    {
+        if (wxGetApp().Contact->GetDb()->Catalog(wxT(""),wxT("catalog.txt")))
+            wxMessageBox(wxT("The file 'catalog.txt' was created."));
+        else
+            wxMessageBox(wxT("Creation of the file 'catalog.txt' was failed."));
         return;
     }
 
@@ -1209,7 +1478,7 @@ bool CeditorDlg::Initialize()
     if (!wxGetApp().Contact)
     {
         wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
-        return FALSE;
+        return false;
     }
 
     // Check if the table exists or not.  If it doesn't, ask the user if they want to 
@@ -1219,19 +1488,16 @@ bool CeditorDlg::Initialize()
                                           wxGetApp().DbConnectInf->GetDefaultDir()))
     {
         wxString tStr;
-        tStr.Printf(wxT("Unable to open the table '%s'.\n\nTable may need to be created...?\n\n"),CONTACT_TABLE_NAME);
-        tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-        wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
-
-        bool createTable = (wxMessageBox(wxT("Do you wish to try to create/clear the CONTACTS table?"),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
+        tStr.Printf(wxT("Unable to open the table '%s'.  The table may\nneed to be created.\n\nDo you wish to try to create/clear the table?\n\n"),CONTACT_TABLE_NAME);
+        bool createTable = (wxMessageBox(tStr.c_str(),wxT("Confirm"),wxYES_NO|wxICON_QUESTION) == wxYES);
 
         if (!createTable)
         {
 //            Close();
-            return FALSE;
+            return false;
         }
         else
-            wxGetApp().CreateDataTable(FALSE);
+            wxGetApp().CreateDataTable(false);
     }
 
     // Tables must be "opened" before anything other than creating/deleting table can be done
@@ -1247,13 +1513,14 @@ bool CeditorDlg::Initialize()
 // open the table.
         if (!wxGetApp().Contact->GetDb()->TablePrivileges(CONTACT_TABLE_NAME, wxT("SELECT"),
                                                 wxGetApp().Contact->GetDb()->GetUsername(),
-                                                                       wxGetApp().Contact->GetDb()->GetUsername(),
-                                                                                               wxGetApp().DbConnectInf->GetDefaultDir()))
+                                                wxGetApp().Contact->GetDb()->GetUsername(),
+                                                wxGetApp().DbConnectInf->GetDefaultDir()))
         {
             wxString tStr;
             tStr.Printf(wxT("Unable to open the table '%s' (likely due to\ninsufficient privileges of the logged in user).\n\n"),CONTACT_TABLE_NAME);
-            tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-            wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
         }
         else 
 #endif
@@ -1263,11 +1530,11 @@ bool CeditorDlg::Initialize()
         {
             wxString tStr;
             tStr.Printf(wxT("Unable to open the table '%s' as the table\ndoes not appear to exist in the tablespace available\nto the currently logged in user.\n\n"),CONTACT_TABLE_NAME);
-            tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-            wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
         }
 
-        return FALSE;
+        return false;
     }
 
     // Build the dialog
@@ -1285,20 +1552,20 @@ bool CeditorDlg::Initialize()
     pNextBtn        = new wxButton(this, EDITOR_DIALOG_NEXT,             wxT("&Next >>"),    wxPoint(430, 121), wxSize( 70,  35), 0, wxDefaultValidator, wxT("NextBtn"));
     pQueryBtn       = new wxButton(this, EDITOR_DIALOG_QUERY,            wxT("&Query"),      wxPoint(430, 161), wxSize( 70,  35), 0, wxDefaultValidator, wxT("QueryBtn"));
     pResetBtn       = new wxButton(this, EDITOR_DIALOG_RESET,            wxT("&Reset"),      wxPoint(430, 200), wxSize( 70,  35), 0, wxDefaultValidator, wxT("ResetBtn"));
-    pNameMsg        = new wxStaticText(this, EDITOR_DIALOG_NAME_MSG,     wxT("Name:"),       wxPoint( 17,  80), wxSize( -1,  -1), 0, wxT("NameMsg"));
+    pNameMsg        = new wxStaticText(this, EDITOR_DIALOG_NAME_MSG,     wxT("Name:"),       wxPoint( 17,  80), wxDefaultSize,    0, wxT("NameMsg"));
     pNameTxt        = new wxTextCtrl(this, EDITOR_DIALOG_NAME_TEXT,      wxT(""),            wxPoint( 17,  97), wxSize(308,  25), 0, wxDefaultValidator, wxT("NameTxt"));
     pNameListBtn    = new wxButton(this, EDITOR_DIALOG_LOOKUP,           wxT("&Lookup"),     wxPoint(333,  97), wxSize( 70,  24), 0, wxDefaultValidator, wxT("LookupBtn"));
-    pAddress1Msg    = new wxStaticText(this, EDITOR_DIALOG_ADDRESS1_MSG, wxT("Address:"),    wxPoint( 17, 130), wxSize( -1,  -1), 0, wxT("Address1Msg"));
+    pAddress1Msg    = new wxStaticText(this, EDITOR_DIALOG_ADDRESS1_MSG, wxT("Address:"),    wxPoint( 17, 130), wxDefaultSize,    0, wxT("Address1Msg"));
     pAddress1Txt    = new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT,  wxT(""),            wxPoint( 17, 147), wxSize(308,  25), 0, wxDefaultValidator, wxT("Address1Txt"));
-    pAddress2Msg    = new wxStaticText(this, EDITOR_DIALOG_ADDRESS2_MSG, wxT("Address:"),    wxPoint( 17, 180), wxSize( -1,  -1), 0, wxT("Address2Msg"));
+    pAddress2Msg    = new wxStaticText(this, EDITOR_DIALOG_ADDRESS2_MSG, wxT("Address:"),    wxPoint( 17, 180), wxDefaultSize,    0, wxT("Address2Msg"));
     pAddress2Txt    = new wxTextCtrl(this, EDITOR_DIALOG_ADDRESS2_TEXT,  wxT(""),            wxPoint( 17, 197), wxSize(308,  25), 0, wxDefaultValidator, wxT("Address2Txt"));
-    pCityMsg        = new wxStaticText(this, EDITOR_DIALOG_CITY_MSG,     wxT("City:"),       wxPoint( 17, 230), wxSize( -1,  -1), 0, wxT("CityMsg"));
+    pCityMsg        = new wxStaticText(this, EDITOR_DIALOG_CITY_MSG,     wxT("City:"),       wxPoint( 17, 230), wxDefaultSize,    0, wxT("CityMsg"));
     pCityTxt        = new wxTextCtrl(this, EDITOR_DIALOG_CITY_TEXT,      wxT(""),            wxPoint( 17, 247), wxSize(225,  25), 0, wxDefaultValidator, wxT("CityTxt"));
-    pStateMsg       = new wxStaticText(this, EDITOR_DIALOG_STATE_MSG,    wxT("State:"),      wxPoint(250, 230), wxSize( -1,  -1), 0, wxT("StateMsg"));
+    pStateMsg       = new wxStaticText(this, EDITOR_DIALOG_STATE_MSG,    wxT("State:"),      wxPoint(250, 230), wxDefaultSize,    0, wxT("StateMsg"));
     pStateTxt       = new wxTextCtrl(this, EDITOR_DIALOG_STATE_TEXT,     wxT(""),            wxPoint(250, 247), wxSize(153,  25), 0, wxDefaultValidator, wxT("StateTxt"));
-    pCountryMsg     = new wxStaticText(this, EDITOR_DIALOG_COUNTRY_MSG,  wxT("Country:"),    wxPoint( 17, 280), wxSize( -1,  -1), 0, wxT("CountryMsg"));
+    pCountryMsg     = new wxStaticText(this, EDITOR_DIALOG_COUNTRY_MSG,  wxT("Country:"),    wxPoint( 17, 280), wxDefaultSize,    0, wxT("CountryMsg"));
     pCountryTxt     = new wxTextCtrl(this, EDITOR_DIALOG_COUNTRY_TEXT,   wxT(""),            wxPoint( 17, 297), wxSize(225,  25), 0, wxDefaultValidator, wxT("CountryTxt"));
-    pPostalCodeMsg  = new wxStaticText(this, EDITOR_DIALOG_POSTAL_MSG,   wxT("Postal Code:"),wxPoint(250, 280), wxSize( -1,  -1), 0, wxT("PostalCodeMsg"));
+    pPostalCodeMsg  = new wxStaticText(this, EDITOR_DIALOG_POSTAL_MSG,   wxT("Postal Code:"),wxPoint(250, 280), wxDefaultSize,    0, wxT("PostalCodeMsg"));
     pPostalCodeTxt  = new wxTextCtrl(this, EDITOR_DIALOG_POSTAL_TEXT,    wxT(""),            wxPoint(250, 297), wxSize(153,  25), 0, wxDefaultValidator, wxT("PostalCodeTxt"));
 
     wxString choice_strings[5];
@@ -1308,26 +1575,27 @@ bool CeditorDlg::Initialize()
     choice_strings[3] = wxT("Spanish");
     choice_strings[4] = wxT("Other");
 
-    pNativeLangChoice = new wxChoice(this, EDITOR_DIALOG_LANG_CHOICE,                             wxPoint( 17, 346), wxSize(277,  -1), 5, choice_strings);
-    pNativeLangMsg    = new wxStaticText(this, EDITOR_DIALOG_LANG_MSG,   wxT("Native language:"), wxPoint( 17, 330), wxSize( -1,  -1), 0, wxT("NativeLangMsg"));
+    pNativeLangChoice = new wxChoice(this, EDITOR_DIALOG_LANG_CHOICE,                             wxPoint( 17, 346), wxSize(277,  wxDefaultCoord), 5, choice_strings);
+    pNativeLangMsg    = new wxStaticText(this, EDITOR_DIALOG_LANG_MSG,   wxT("Native language:"), wxPoint( 17, 330), wxDefaultSize, 0, wxT("NativeLangMsg"));
 
     wxString radio_strings[2];
     radio_strings[0]  = wxT("No");
     radio_strings[1]  = wxT("Yes");
-    pDeveloperRadio   = new wxRadioBox(this,EDITOR_DIALOG_DEVELOPER,     wxT("Developer:"),       wxPoint(303, 330), wxSize( -1,  -1), 2, radio_strings, 2, wxHORIZONTAL);
-    pJoinDateMsg      = new wxStaticText(this, EDITOR_DIALOG_JOIN_MSG,   wxT("Date joined:"),     wxPoint( 17, 380), wxSize( -1,  -1), 0, wxT("JoinDateMsg"));
+    pDeveloperRadio   = new wxRadioBox(this,EDITOR_DIALOG_DEVELOPER,     wxT("Developer:"),       wxPoint(303, 330), wxDefaultSize, 2, radio_strings, 2, wxHORIZONTAL);
+    pJoinDateMsg      = new wxStaticText(this, EDITOR_DIALOG_JOIN_MSG,   wxT("Date joined:"),     wxPoint( 17, 380), wxDefaultSize, 0, wxT("JoinDateMsg"));
     pJoinDateTxt      = new wxTextCtrl(this, EDITOR_DIALOG_JOIN_TEXT,    wxT(""),                 wxPoint( 17, 397), wxSize(150,  25), 0, wxDefaultValidator, wxT("JoinDateTxt"));
-    pContribMsg       = new wxStaticText(this, EDITOR_DIALOG_CONTRIB_MSG,wxT("Contributions:"),   wxPoint(175, 380), wxSize( -1,  -1), 0, wxT("ContribMsg"));
+    pContribMsg       = new wxStaticText(this, EDITOR_DIALOG_CONTRIB_MSG,wxT("Contributions:"),   wxPoint(175, 380), wxDefaultSize, 0, wxT("ContribMsg"));
     pContribTxt       = new wxTextCtrl(this, EDITOR_DIALOG_CONTRIB_TEXT, wxT(""),                 wxPoint(175, 397), wxSize(120,  25), 0, wxDefaultValidator, wxT("ContribTxt"));
-    pLinesMsg         = new wxStaticText(this, EDITOR_DIALOG_LINES_MSG,  wxT("Lines of code:"),   wxPoint(303, 380), wxSize( -1,  -1), 0, wxT("LinesMsg"));
+    pLinesMsg         = new wxStaticText(this, EDITOR_DIALOG_LINES_MSG,  wxT("Lines of code:"),   wxPoint(303, 380), wxDefaultSize, 0, wxT("LinesMsg"));
     pLinesTxt         = new wxTextCtrl(this, EDITOR_DIALOG_LINES_TEXT,   wxT(""),                 wxPoint(303, 397), wxSize(100,  25), 0, wxDefaultValidator, wxT("LinesTxt"));
 
+    pCatalogBtn       = new wxButton(this, EDITOR_DIALOG_CATALOG,        wxT("Catalo&g"),         wxPoint(430, 287), wxSize( 70,  35), 0, wxDefaultValidator, wxT("CatalogBtn"));
     pDataTypesBtn     = new wxButton(this, EDITOR_DIALOG_DATATYPES,      wxT("Data&types"),       wxPoint(430, 337), wxSize( 70,  35), 0, wxDefaultValidator, wxT("DataTypesBtn"));
     pDbDiagsBtn       = new wxButton(this, EDITOR_DIALOG_DB_DIAGS,       wxT("DB Dia&gs"),        wxPoint(430, 387), wxSize( 70,  35), 0, wxDefaultValidator, wxT("DbDiagsBtn"));
 
     // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to 
     // handle all widget processing
-    widgetPtrsSet = TRUE;
+    widgetPtrsSet = true;
 
     // Setup the orderBy and where clauses to return back a single record as the result set, 
     // as there will only be one record being shown on the dialog at a time, this optimizes
@@ -1355,15 +1623,15 @@ bool CeditorDlg::Initialize()
        wxGetApp().Contact->SetWhereClause(wxT(""));
 
     // Perform the Query to get the result set.  
-    // NOTE: If there are no rows returned, that is a valid result, so Query() would return TRUE.  
-    //       Only if there is a database error will Query() come back as FALSE
+    // NOTE: If there are no rows returned, that is a valid result, so Query() would return true.  
+    //       Only if there is a database error will Query() come back as false
     if (!wxGetApp().Contact->Query())
     {
         wxString tStr;
-        tStr  = wxT("ODBC error during Query()\n\n");
-        tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-        wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
-        return FALSE;
+        tStr = wxT("ODBC error during Query()\n\n");
+        wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                     wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+        return false;
     }
 
     // Since Query succeeded, now get the row that was returned
@@ -1378,10 +1646,10 @@ bool CeditorDlg::Initialize()
     SetMode(mView);
     PutData();
 
-    Show(TRUE);
+    Show(true);
 
-    initialized = TRUE;
-    return TRUE;
+    initialized = true;
+    return true;
 }  // CeditorDlg::Initialize()
 
 
@@ -1409,18 +1677,18 @@ void CeditorDlg::FieldsEditable()
 
 void CeditorDlg::SetMode(enum DialogModes m)
 {
-    bool edit = FALSE;
+    bool edit = false;
 
     mode = m;
     switch (mode)
     {
         case mCreate:
         case mEdit:
-            edit = TRUE;
+            edit = true;
             break;
         case mView:
         case mSearch:
-            edit = FALSE;
+            edit = false;
             break;
         default:
                 break;
@@ -1470,7 +1738,7 @@ bool CeditorDlg::PutData()
 
     pDeveloperRadio->SetSelection(wxGetApp().Contact->IsDeveloper);
 
-    return TRUE;
+    return true;
 }  // Ceditor::PutData()
 
 
@@ -1478,7 +1746,7 @@ bool CeditorDlg::PutData()
  * Reads the data out of all the widgets on the dialog.  Some data evaluation is done
  * to ensure that there is a name entered and that the date field is valid.
  *
- * A return value of TRUE means that valid data was retrieved from the dialog, otherwise
+ * A return value of true means that valid data was retrieved from the dialog, otherwise
  * invalid data was found (and a message was displayed telling the user what to fix), and
  * the data was not placed into the appropraite fields of Ccontact
  */
@@ -1491,16 +1759,16 @@ bool CeditorDlg::GetData()
     if (!wxStrcmp((const wxChar*) tStr,wxT("")))
     {
         wxMessageBox(wxT("A name is required for entry into the contact table"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
-        return FALSE;
+        return false;
     }
 
-    bool   invalid = FALSE;
-    int    mm,dd,yyyy;
+    bool   invalid = false;
+    int    mm = 1,dd = 1,yyyy = 2001;
     int    first, second;
 
     tStr = pJoinDateTxt->GetValue();
     if (tStr.Freq(wxT('/')) != 2)
-        invalid = TRUE;
+        invalid = true;
 
     // Find the month, day, and year tokens
     if (!invalid)
@@ -1508,39 +1776,39 @@ bool CeditorDlg::GetData()
         first   = tStr.First(wxT('/'));
         second  = tStr.Last(wxT('/'));
 
-        mm      = atoi(tStr.SubString(0,first));
-        dd      = atoi(tStr.SubString(first+1,second));
-        yyyy    = atoi(tStr.SubString(second+1,tStr.Length()-1));
+        mm      = wxAtoi(tStr.SubString(0,first));
+        dd      = wxAtoi(tStr.SubString(first+1,second));
+        yyyy    = wxAtoi(tStr.SubString(second+1,tStr.Length()-1));
 
         invalid = !(mm && dd && yyyy);
     }
 
     // Force Year 2000 compliance
     if (!invalid && (yyyy < 1000))
-        invalid = TRUE;
+        invalid = true;
 
     // Check the token ranges for validity
     if (!invalid)
     {
         if (yyyy > 9999)
-            invalid = TRUE;
+            invalid = true;
         else if ((mm < 1) || (mm > 12))
-            invalid = TRUE;
+            invalid = true;
         else
         {
             if (dd < 1)
-                invalid = TRUE;
+                invalid = true;
             else
             {
                 int days[12] = {31,28,31,30,31,30,
                                 31,31,30,31,30,31};
                 if (dd > days[mm-1])
                 {
-                    invalid = TRUE;
+                    invalid = true;
                     if ((dd == 29) && (mm == 2))
                     {
                         if (((yyyy % 4) == 0) && (((yyyy % 100) != 0) || ((yyyy % 400) == 0)))
-                            invalid = FALSE;
+                            invalid = false;
                     }
                 }
             }
@@ -1556,7 +1824,7 @@ bool CeditorDlg::GetData()
     else
     {
         wxMessageBox(wxT("Improper date format.  Please check the date\nspecified and try again.\n\nNOTE: Dates are in american format (MM/DD/YYYY)"),wxT("Notice..."),wxOK | wxICON_INFORMATION);
-        return FALSE;
+        return false;
     }
 
     tStr = pNameTxt->GetValue();
@@ -1568,13 +1836,13 @@ bool CeditorDlg::GetData()
     wxStrcpy(wxGetApp().Contact->Country,pCountryTxt->GetValue());
     wxStrcpy(wxGetApp().Contact->PostalCode,pPostalCodeTxt->GetValue());
 
-    wxGetApp().Contact->Contributions = atoi(pContribTxt->GetValue());
-    wxGetApp().Contact->LinesOfCode = atol(pLinesTxt->GetValue());
+    wxGetApp().Contact->Contributions = wxAtoi(pContribTxt->GetValue());
+    wxGetApp().Contact->LinesOfCode = wxAtol(pLinesTxt->GetValue());
 
     wxGetApp().Contact->NativeLanguage = (enum Language) pNativeLangChoice->GetSelection();
     wxGetApp().Contact->IsDeveloper = pDeveloperRadio->GetSelection() > 0;
 
-    return TRUE;
+    return true;
 }  // CeditorDlg::GetData()
 
 
@@ -1583,17 +1851,17 @@ bool CeditorDlg::GetData()
  * try to insert/update the data to the table based on the current 'mode' the dialog
  * is set to.
  *
- * A return value of TRUE means the insert/update was completed successfully, a return
- * value of FALSE means that Save() failed.  If returning FALSE, then this function
+ * A return value of true means the insert/update was completed successfully, a return
+ * value of false means that Save() failed.  If returning false, then this function
  * has displayed a detailed error message for the user.
  */
 bool CeditorDlg::Save()
 {
-    bool failed = FALSE;
+    bool failed = false;
 
     // Read the data in the widgets of the dialog to get the user's data
     if (!GetData())
-        failed = TRUE;
+        failed = true;
 
     // Perform any other required validations necessary before saving
     if (!failed)
@@ -1612,31 +1880,31 @@ bool CeditorDlg::Save()
                 if (result == DB_ERR_INTEGRITY_CONSTRAINT_VIOL)
                 {
                     wxString tStr;
-                    tStr  = wxT("A duplicate key value already exists in the table.\nUnable to save record\n\n");
-                    tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-                    wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+                    tStr = wxT("A duplicate key value already exists in the table.\nUnable to save record\n\n");
+                    wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                                 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
                 }
                 else
                 {
                     // Some other unexpected error occurred
                     wxString tStr;
-                    tStr  = wxT("Database insert failed\n\n");
-                    tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-                    wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+                    tStr = wxT("Database insert failed\n\n");
+                    wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                                 wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
                 }
             }
         }
         else  // mode == mEdit
         {
             wxGetApp().Contact->GetDb()->RollbackTrans();
-            wxGetApp().Contact->whereStr.Printf("NAME = '%s'",saveName.c_str());
+            wxGetApp().Contact->whereStr.Printf(wxT("NAME = '%s'"),saveName.c_str());
             if (!wxGetApp().Contact->UpdateWhere(wxGetApp().Contact->whereStr))
             {
                 wxString tStr;
-                tStr  = wxT("Database update failed\n\n");
-                tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-                wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
-                failed = TRUE;
+                tStr = wxT("Database update failed\n\n");
+                wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                             wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+                failed = true;
             }
         }
 
@@ -1740,20 +2008,20 @@ bool CeditorDlg::GetRec(const wxString &whereStr)
     if (!wxGetApp().Contact->Query())
     {
         wxString tStr;
-        tStr  = wxT("ODBC error during Query()\n\n");
-        tStr += GetExtendedDBErrorMsg(wxGetApp().Contact->GetDb(),__FILE__,__LINE__);
-        wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+        tStr = wxT("ODBC error during Query()\n\n");
+        wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                     wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
 
-        return(FALSE);
+        return(false);
     }
 
     if (wxGetApp().Contact->GetNext())
     {
         PutData();
-        return(TRUE);
+        return(true);
     }
     else
-        return(FALSE);
+        return(false);
 }  // CeditorDlg::GetRec()
 
 
@@ -1768,29 +2036,29 @@ BEGIN_EVENT_TABLE(CparameterDlg, wxDialog)
     EVT_CLOSE(CparameterDlg::OnCloseWindow)
 END_EVENT_TABLE()
 
-CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialog (parent, PARAMETER_DIALOG, wxT("ODBC parameter settings"), wxPoint(-1, -1), wxSize(400, 325))
+CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialog (parent, PARAMETER_DIALOG, wxT("ODBC parameter settings"), wxDefaultPosition, wxSize(400, 325))
 {
     // Since the ::OnCommand() function is overridden, this prevents the widget
     // detection in ::OnCommand() until all widgets have been initialized to prevent
     // uninitialized pointers from crashing the program
-    widgetPtrsSet = FALSE;
+    widgetPtrsSet = false;
 
-    pParamODBCSourceMsg  = new wxStaticText(this, PARAMETER_DIALOG_SOURCE_MSG,   wxT("ODBC data sources:"),   wxPoint( 10, 10),    wxSize( -1,  -1), 0, wxT("ParamODBCSourceMsg"));
+    pParamODBCSourceMsg  = new wxStaticText(this, PARAMETER_DIALOG_SOURCE_MSG,   wxT("ODBC data sources:"),   wxPoint( 10, 10),    wxDefaultSize, 0, wxT("ParamODBCSourceMsg"));
     pParamODBCSourceList = new wxListBox(this, PARAMETER_DIALOG_SOURCE_LISTBOX,                          wxPoint( 10, 29),    wxSize(285, 150), 0, 0, wxLB_SINGLE|wxLB_ALWAYS_SB, wxDefaultValidator, wxT("ParamODBCSourceList"));
-    pParamUserNameMsg    = new wxStaticText(this, PARAMETER_DIALOG_NAME_MSG,     wxT("Database user name:"),  wxPoint( 10, 193),   wxSize( -1,  -1), 0, wxT("ParamUserNameMsg"));
+    pParamUserNameMsg    = new wxStaticText(this, PARAMETER_DIALOG_NAME_MSG,     wxT("Database user name:"),  wxPoint( 10, 193),   wxDefaultSize, 0, wxT("ParamUserNameMsg"));
     pParamUserNameTxt    = new wxTextCtrl(this, PARAMETER_DIALOG_NAME_TEXT,      wxT(""), wxPoint(10, 209),   wxSize( 140, 25),    0, wxDefaultValidator, wxT("ParamUserNameTxt"));
-    pParamPasswordMsg    = new wxStaticText(this, PARAMETER_DIALOG_PASSWORD_MSG, wxT("Password:"),            wxPoint(156, 193),   wxSize( -1,  -1), 0, wxT("ParamPasswordMsg"));
+    pParamPasswordMsg    = new wxStaticText(this, PARAMETER_DIALOG_PASSWORD_MSG, wxT("Password:"),            wxPoint(156, 193),   wxDefaultSize, 0, wxT("ParamPasswordMsg"));
     pParamPasswordTxt    = new wxTextCtrl(this, PARAMETER_DIALOG_PASSWORD_TEXT,  wxT(""), wxPoint(156, 209),  wxSize( 140,  25),   0, wxDefaultValidator, wxT("ParamPasswordTxt"));
-    pParamDirPathMsg     = new wxStaticText(this, PARAMETER_DIALOG_DIRPATH_MSG,  wxT("Directory:"),           wxPoint( 10, 243),   wxSize( -1,  -1), 0, wxT("ParamDirPathMsg"));
+    pParamDirPathMsg     = new wxStaticText(this, PARAMETER_DIALOG_DIRPATH_MSG,  wxT("Directory:"),           wxPoint( 10, 243),   wxDefaultSize, 0, wxT("ParamDirPathMsg"));
     pParamDirPathTxt     = new wxTextCtrl(this, PARAMETER_DIALOG_DIRPATH_TEXT,   wxT(""),                     wxPoint( 10, 259),   wxSize(140,  25), 0, wxDefaultValidator, wxT("ParamDirPathTxt"));
     pParamSaveBtn        = new wxButton(this, PARAMETER_DIALOG_SAVE,             wxT("&Save"),                wxPoint(310,  21),   wxSize( 70,  35), 0, wxDefaultValidator, wxT("ParamSaveBtn"));
     pParamCancelBtn      = new wxButton(this, PARAMETER_DIALOG_CANCEL,           wxT("C&ancel"),              wxPoint(310,  66),   wxSize( 70,  35), 0, wxDefaultValidator, wxT("ParamCancelBtn"));
 
     // Now that all the widgets on the panel are created, its safe to allow ::OnCommand() to 
     // handle all widget processing
-    widgetPtrsSet = TRUE;
+    widgetPtrsSet = true;
 
-    saved = FALSE;
+    saved = false;
     savedParamSettings = wxGetApp().params;
 
     Centre(wxBOTH);
@@ -1822,7 +2090,7 @@ void CparameterDlg::OnCloseWindow(wxCloseEvent& event)
     while (wxIsBusy())
         wxEndBusyCursor();
 
-    Show(FALSE);
+    Show(false);
     SetReturnCode(0);  // added so BoundsChecker would not report use of uninitialized variable
 
     this->Destroy();
@@ -1836,7 +2104,7 @@ void CparameterDlg::OnButton( wxCommandEvent &event )
 }
 
 
-void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
+void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& WXUNUSED(event))
 {
     wxString widgetName;
     
@@ -1854,7 +2122,7 @@ void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
             if (GetParent() != NULL)  // The parameter dialog was not called during startup due to a missing cfg file
                 tStr += wxT("\nNew parameters will take effect the next time the program is started.");
             wxMessageBox(tStr,wxT("Notice..."),wxOK | wxICON_INFORMATION);
-            saved = TRUE;
+            saved = true;
             Close();
         }
         return;
@@ -1875,11 +2143,15 @@ bool CparameterDlg::PutData()
 
     // Fill in the fields from the params object
     if (wxGetApp().params.ODBCSource && wxStrlen(wxGetApp().params.ODBCSource))
-        pParamODBCSourceList->SetStringSelection(wxGetApp().params.ODBCSource);
+    {
+        int index = pParamODBCSourceList->FindString(wxGetApp().params.ODBCSource);
+        if (index != wxNOT_FOUND)
+            pParamODBCSourceList->SetSelection(index);
+    }
     pParamUserNameTxt->SetValue(wxGetApp().params.UserName);
     pParamPasswordTxt->SetValue(wxGetApp().params.Password);
     pParamDirPathTxt->SetValue(wxGetApp().params.DirPath);
-    return TRUE;
+    return true;
 }  // CparameterDlg::PutData()
 
 
@@ -1894,12 +2166,12 @@ bool CparameterDlg::GetData()
             wxString errmsg;
             errmsg.Printf(wxT("ODBC Data source name is longer than the data structure to hold it.\n'Cparameter.ODBCSource' must have a larger character array\nto handle a data source with this long of a name\n\nThe data source currently selected is %d characters long."),tStr.Length());
             wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
-            return FALSE;
+            return false;
         }
         wxStrcpy(wxGetApp().params.ODBCSource, tStr);
     }
     else
-        return FALSE;
+        return false;
     
     tStr = pParamUserNameTxt->GetValue();
     if (tStr.Length() > (sizeof(wxGetApp().params.UserName)-1))
@@ -1907,7 +2179,7 @@ bool CparameterDlg::GetData()
         wxString errmsg;
         errmsg.Printf(wxT("User name is longer than the data structure to hold it.\n'Cparameter.UserName' must have a larger character array\nto handle a data source with this long of a name\n\nThe user name currently specified is %d characters long."),tStr.Length());
         wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
-        return FALSE;
+        return false;
     }
     wxStrcpy(wxGetApp().params.UserName, tStr);
 
@@ -1917,7 +2189,7 @@ bool CparameterDlg::GetData()
         wxString errmsg;
         errmsg.Printf(wxT("Password is longer than the data structure to hold it.\n'Cparameter.Password' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr.Length());
         wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
-        return FALSE;
+        return false;
     }
     wxStrcpy(wxGetApp().params.Password,tStr);
 
@@ -1928,10 +2200,10 @@ bool CparameterDlg::GetData()
         wxString errmsg;
         errmsg.Printf(wxT("DirPath is longer than the data structure to hold it.\n'Cparameter.DirPath' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long."),tStr.Length());
         wxMessageBox(errmsg,wxT("Internal program error..."),wxOK | wxICON_EXCLAMATION);
-        return FALSE;
+        return false;
     }
     wxStrcpy(wxGetApp().params.DirPath,tStr);
-    return TRUE;
+    return true;
 }  // CparameterDlg::GetData()
 
 
@@ -1942,12 +2214,12 @@ bool CparameterDlg::Save()
     if (!GetData())
     {
         wxGetApp().params = savedParamSettings;
-        return FALSE;
+        return false;
     }
 
     wxGetApp().WriteParamFile(wxGetApp().params);
 
-    return TRUE;
+    return true;
 }  // CparameterDlg::Save()
 
 
@@ -1955,26 +2227,24 @@ void CparameterDlg::FillDataSourceList()
 {
     wxChar Dsn[SQL_MAX_DSN_LENGTH + 1];
     wxChar DsDesc[255];
-    wxStringList strList;
+    wxSortedArrayString strArr;
 
     while (wxDbGetDataSource(wxGetApp().DbConnectInf->GetHenv(), Dsn,
                              SQL_MAX_DSN_LENGTH+1, DsDesc, 255))
-        strList.Add(Dsn);
-
-    strList.Sort();
-    strList.Add(wxT(""));
-    wxChar **p = strList.ListToArray();
+    {
+        strArr.Add(Dsn);
+    }
 
-    int i;
-    for (i = 0; wxStrlen(p[i]); i++)
-        pParamODBCSourceList->Append(p[i]);
+    for (size_t i=0; i < strArr.GetCount(); i++ )
+    {
+        pParamODBCSourceList->Append(strArr[i].c_str());
+    }
 
-    wxDELETEA(p);
 }  // CparameterDlg::FillDataSourceList()
 
 
 BEGIN_EVENT_TABLE(CqueryDlg, wxDialog)
-    EVT_BUTTON(-1,  CqueryDlg::OnButton)
+    EVT_BUTTON(wxID_ANY,  CqueryDlg::OnButton)
     EVT_CLOSE(CqueryDlg::OnCloseWindow)
 END_EVENT_TABLE()
 
@@ -1982,14 +2252,14 @@ END_EVENT_TABLE()
 // CqueryDlg() constructor
 CqueryDlg::CqueryDlg(wxWindow *parent, wxDb *pDb, wxChar *tblName[], 
                      const wxString &pWhereArg) :
-    wxDialog (parent, QUERY_DIALOG, wxT("Query"), wxPoint(-1, -1), wxSize(480, 360))
+    wxDialog (parent, QUERY_DIALOG, wxT("Query"), wxDefaultPosition, wxSize(480, 360))
 {
     wxBeginBusyCursor();
 
     colInf = 0;
     dbTable = 0;
     masterTableName = tblName[0];
-    widgetPtrsSet = FALSE;
+    widgetPtrsSet = false;
     pDB = pDb;
 
     // Initialize the WHERE clause from the string passed in
@@ -2005,7 +2275,7 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDb *pDb, wxChar *tblName[],
 
     pQueryCol1Msg           = new wxStaticText(this, QUERY_DIALOG_COL_MSG,    wxT("Column 1:"),   wxPoint( 10,  10), wxSize( 69,  16), 0, wxT("QueryCol1Msg"));
     pQueryCol1Choice        = new wxChoice(this, QUERY_DIALOG_COL_CHOICE,                    wxPoint( 10,  27), wxSize(250,  27), 0, 0, 0, wxDefaultValidator, wxT("QueryCol1Choice"));
-    pQueryNotMsg            = new wxStaticText(this, QUERY_DIALOG_NOT_MSG,    wxT("NOT"),         wxPoint(268,  10), wxSize( -1,  -1), 0, wxT("QueryNotMsg"));
+    pQueryNotMsg            = new wxStaticText(this, QUERY_DIALOG_NOT_MSG,    wxT("NOT"),         wxPoint(268,  10), wxDefaultSize, 0, wxT("QueryNotMsg"));
     pQueryNotCheck          = new wxCheckBox(this, QUERY_DIALOG_NOT_CHECKBOX, wxT(""),            wxPoint(275,  37), wxSize( 20,  20), 0, wxDefaultValidator, wxT("QueryNotCheck"));
 
     wxString choice_strings[9];
@@ -2019,11 +2289,11 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDb *pDb, wxChar *tblName[],
     choice_strings[7] = wxT("Like");
     choice_strings[8] = wxT("Between");
 
-    pQueryOperatorMsg       = new wxStaticText(this, QUERY_DIALOG_OP_MSG,       wxT("Operator:"),         wxPoint(305,  10), wxSize( -1,  -1), 0, wxT("QueryOperatorMsg"));
+    pQueryOperatorMsg       = new wxStaticText(this, QUERY_DIALOG_OP_MSG,       wxT("Operator:"),         wxPoint(305,  10), wxDefaultSize, 0, wxT("QueryOperatorMsg"));
     pQueryOperatorChoice    = new wxChoice(this, QUERY_DIALOG_OP_CHOICE,                                  wxPoint(305,  27), wxSize( 80,  27), 9, choice_strings, 0, wxDefaultValidator, wxT("QueryOperatorChoice"));
     pQueryCol2Msg           = new wxStaticText(this, QUERY_DIALOG_COL2_MSG,     wxT("Column 2:"),         wxPoint( 10,  65), wxSize( 69,  16), 0, wxT("QueryCol2Msg"));
     pQueryCol2Choice        = new wxChoice(this, QUERY_DIALOG_COL2_CHOICE,                                wxPoint( 10,  82), wxSize(250,  27), 0, 0, 0, wxDefaultValidator, wxT("QueryCol2Choice"));
-    pQuerySqlWhereMsg       = new wxStaticText(this, QUERY_DIALOG_WHERE_MSG,    wxT("SQL where clause:"), wxPoint( 10, 141), wxSize( -1,  -1), 0, wxT("QuerySqlWhereMsg"));
+    pQuerySqlWhereMsg       = new wxStaticText(this, QUERY_DIALOG_WHERE_MSG,    wxT("SQL where clause:"), wxPoint( 10, 141), wxDefaultSize, 0, wxT("QuerySqlWhereMsg"));
     pQuerySqlWhereMtxt      = new wxTextCtrl(this, QUERY_DIALOG_WHERE_TEXT,     wxT(""),                  wxPoint( 10, 159), wxSize(377, 134), wxTE_MULTILINE, wxDefaultValidator, wxT("QuerySqlWhereMtxt"));
     pQueryAddBtn            = new wxButton(this, QUERY_DIALOG_ADD,              wxT("&Add"),              wxPoint(406,  24), wxSize( 56,  26), 0, wxDefaultValidator, wxT("QueryAddBtn"));
     pQueryAndBtn            = new wxButton(this, QUERY_DIALOG_AND,              wxT("A&nd"),              wxPoint(406,  58), wxSize( 56,  26), 0, wxDefaultValidator, wxT("QueryAndBtn"));
@@ -2033,14 +2303,14 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDb *pDb, wxChar *tblName[],
     pQueryDoneBtn           = new wxButton(this, QUERY_DIALOG_DONE,             wxT("&Done"),             wxPoint(406, 185), wxSize( 56,  26), 0, wxDefaultValidator, wxT("QueryDoneBtn"));
     pQueryClearBtn          = new wxButton(this, QUERY_DIALOG_CLEAR,            wxT("C&lear"),            wxPoint(406, 218), wxSize( 56,  26), 0, wxDefaultValidator, wxT("QueryClearBtn"));
     pQueryCountBtn          = new wxButton(this, QUERY_DIALOG_COUNT,            wxT("&Count"),            wxPoint(406, 252), wxSize( 56,  26), 0, wxDefaultValidator, wxT("QueryCountBtn"));
-    pQueryValue1Msg         = new wxStaticText(this, QUERY_DIALOG_VALUE1_MSG,   wxT("Value:"),            wxPoint(277,  66), wxSize( -1,  -1), 0, wxT("QueryValue1Msg"));
+    pQueryValue1Msg         = new wxStaticText(this, QUERY_DIALOG_VALUE1_MSG,   wxT("Value:"),            wxPoint(277,  66), wxDefaultSize, 0, wxT("QueryValue1Msg"));
     pQueryValue1Txt         = new wxTextCtrl(this, QUERY_DIALOG_VALUE1_TEXT,    wxT(""),                  wxPoint(277,  83), wxSize(108,  25), 0, wxDefaultValidator, wxT("QueryValue1Txt"));
-    pQueryValue2Msg         = new wxStaticText(this, QUERY_DIALOG_VALUE2_MSG,   wxT("AND"),               wxPoint(238, 126), wxSize( -1,  -1), 0, wxT("QueryValue2Msg"));
+    pQueryValue2Msg         = new wxStaticText(this, QUERY_DIALOG_VALUE2_MSG,   wxT("AND"),               wxPoint(238, 126), wxDefaultSize, 0, wxT("QueryValue2Msg"));
     pQueryValue2Txt         = new wxTextCtrl(this, QUERY_DIALOG_VALUE2_TEXT,    wxT(""),                  wxPoint(277, 120), wxSize(108,  25), 0, wxDefaultValidator, wxT("QueryValue2Txt"));
     pQueryHintGrp           = new wxStaticBox(this, QUERY_DIALOG_HINT_GROUP,    wxT(""),                  wxPoint( 10, 291), wxSize(377,  40), 0, wxT("QueryHintGrp"));
-    pQueryHintMsg           = new wxStaticText(this, QUERY_DIALOG_HINT_MSG,     wxT(""),                  wxPoint( 16, 306), wxSize( -1,  -1), 0, wxT("QueryHintMsg"));
+    pQueryHintMsg           = new wxStaticText(this, QUERY_DIALOG_HINT_MSG,     wxT(""),                  wxPoint( 16, 306), wxDefaultSize, 0, wxT("QueryHintMsg"));
 
-    widgetPtrsSet = TRUE;
+    widgetPtrsSet = true;
     // Initialize the dialog
     wxString qualName;
     pQueryCol2Choice->Append(wxT("VALUE -->"));
@@ -2050,9 +2320,9 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDb *pDb, wxChar *tblName[],
     {
         wxEndBusyCursor();
         wxString tStr;
-        tStr  = wxT("ODBC error during GetColumns()\n\n");
-        tStr += GetExtendedDBErrorMsg(pDb,__FILE__,__LINE__);
-        wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+        tStr = wxT("ODBC error during GetColumns()\n\n");
+        wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                     wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
         return;
     }
 
@@ -2078,8 +2348,8 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDb *pDb, wxChar *tblName[],
     pQueryCol2Choice->SetSelection(0);
     pQueryOperatorChoice->SetSelection(0);
 
-    pQueryValue2Msg->Show(FALSE);
-    pQueryValue2Txt->Show(FALSE);
+    pQueryValue2Msg->Show(false);
+    pQueryValue2Txt->Show(false);
 
     pQueryHintMsg->SetLabel(langQRY_EQ);
 
@@ -2105,7 +2375,7 @@ void CqueryDlg::OnButton(wxCommandEvent &event)
 }  // CqueryDlg::OnButton()
 
 
-void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
+void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& WXUNUSED(event))
 {
     // Widget pointers won't be set when the dialog is constructed.
     // Control is passed through this function once for each widget on
@@ -2151,8 +2421,8 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
         }
 
         // Hide the value2 widget
-        pQueryValue2Msg->Show(FALSE);  // BETWEEN will show this widget
-        pQueryValue2Txt->Show(FALSE);  // BETWEEN will show this widget
+        pQueryValue2Msg->Show(false);  // BETWEEN will show this widget
+        pQueryValue2Txt->Show(false);  // BETWEEN will show this widget
 
         // Disable the NOT operator for <, <=, >, >=
         switch((qryOp) pQueryOperatorChoice->GetSelection())
@@ -2162,10 +2432,10 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
             case qryOpLE:
             case qryOpGE:
                 pQueryNotCheck->SetValue(0);
-                pQueryNotCheck->Enable(FALSE);
+                pQueryNotCheck->Enable(false);
                 break;
             default:
-                pQueryNotCheck->Enable(TRUE);
+                pQueryNotCheck->Enable(true);
                 break;
         }
 
@@ -2177,16 +2447,16 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
             case qryOpGT:
             case qryOpLE:
             case qryOpGE:
-                pQueryCol2Choice->Enable(TRUE);
+                pQueryCol2Choice->Enable(true);
                 if (pQueryCol2Choice->GetSelection())    // Column name is highlighted
                 {
-                    pQueryValue1Msg->Show(FALSE);
-                    pQueryValue1Txt->Show(FALSE);
+                    pQueryValue1Msg->Show(false);
+                    pQueryValue1Txt->Show(false);
                 }
                 else                                                // "Value" is highlighted
                 {
-                    pQueryValue1Msg->Show(TRUE);
-                    pQueryValue1Txt->Show(TRUE);
+                    pQueryValue1Msg->Show(true);
+                    pQueryValue1Txt->Show(true);
                     pQueryValue1Txt->SetFocus();
                 }
                 break;
@@ -2194,18 +2464,18 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
             case qryOpCONTAINS:
             case qryOpLIKE:
                 pQueryCol2Choice->SetSelection(0);
-                pQueryCol2Choice->Enable(FALSE);
-                pQueryValue1Msg->Show(TRUE);
-                pQueryValue1Txt->Show(TRUE);
+                pQueryCol2Choice->Enable(false);
+                pQueryValue1Msg->Show(true);
+                pQueryValue1Txt->Show(true);
                 pQueryValue1Txt->SetFocus();
                 break;
             case qryOpBETWEEN:
                 pQueryCol2Choice->SetSelection(0);
-                pQueryCol2Choice->Enable(FALSE);
-                pQueryValue2Msg->Show(TRUE);
-                pQueryValue2Txt->Show(TRUE);
-                pQueryValue1Msg->Show(TRUE);
-                pQueryValue1Txt->Show(TRUE);
+                pQueryCol2Choice->Enable(false);
+                pQueryValue2Msg->Show(true);
+                pQueryValue2Txt->Show(true);
+                pQueryValue1Msg->Show(true);
+                pQueryValue1Txt->Show(true);
                 pQueryValue1Txt->SetFocus();
                 break;
         }
@@ -2219,13 +2489,13 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
     {
         if (pQueryCol2Choice->GetSelection())    // Column name is highlighted
         {
-            pQueryValue1Msg->Show(FALSE);
-            pQueryValue1Txt->Show(FALSE);
+            pQueryValue1Msg->Show(false);
+            pQueryValue1Txt->Show(false);
         }
         else                                                // "Value" is highlighted
         {
-            pQueryValue1Msg->Show(TRUE);
-            pQueryValue1Txt->Show(TRUE);
+            pQueryValue1Msg->Show(true);
+            pQueryValue1Txt->Show(true);
             pQueryValue1Txt->SetFocus();
         }
         return;
@@ -2308,7 +2578,7 @@ void CqueryDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
 }  // CqueryDlg::OnCommand
 
 
-void CqueryDlg::OnCloseWindow(wxCloseEvent& event)
+void CqueryDlg::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
 {
     // Clean up
     wxDELETEA(colInf);
@@ -2319,7 +2589,7 @@ void CqueryDlg::OnCloseWindow(wxCloseEvent& event)
     while (wxIsBusy())
         wxEndBusyCursor();
 
-    Show(FALSE);
+    Show(false);
     SetReturnCode(1);  // added so BoundsChecker would not report use of uninitialized variable
 
     this->Destroy();
@@ -2398,12 +2668,12 @@ void CqueryDlg::ProcessAddBtn()
 
     int col1Idx = pQueryCol1Choice->GetSelection();
 
-    bool quote = FALSE;
+    bool quote = false;
     if (colInf[col1Idx].sqlDataType == SQL_VARCHAR  ||
         oper == qryOpBEGINS                         ||
         oper == qryOpCONTAINS                       ||
         oper == qryOpLIKE)
-        quote = TRUE;
+        quote = true;
 
     if (pQueryCol2Choice->GetSelection())    // Column name
         s += pQueryCol2Choice->GetStringSelection();
@@ -2453,9 +2723,9 @@ void CqueryDlg::ProcessCountBtn()
         if (!dbTable->Open())
         {
             wxString tStr;
-            tStr  = wxT("ODBC error during Open()\n\n");
-            tStr += GetExtendedDBErrorMsg(dbTable->GetDb(),__FILE__,__LINE__);
-            wxMessageBox(tStr,wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+            tStr = wxT("ODBC error during Open()\n\n");
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
             return;
         }
     }
@@ -2500,14 +2770,14 @@ bool CqueryDlg::ValidateWhereClause()
     if (where.Freq(wxT('(')) != where.Freq(wxT(')')))
     {
         wxMessageBox(wxT("There are mismatched parenthesis in the constructed where clause"),wxT("Error..."),wxOK | wxICON_EXCLAMATION);
-        return(FALSE);
+        return(false);
     }
     // After a wxMessageBox, the focus does not necessarily return to the
     // window which was the focus when the message box popped up, so return
     // focus to the Query dialog for certain
     SetFocus();
 
-    return(TRUE);
+    return(true);
 
 }  // CqueryDlg::ValidateWhereClause()
 
@@ -2515,344 +2785,468 @@ bool CqueryDlg::ValidateWhereClause()
 
 void DisplayDbDiagnostics(wxDb *pDb)
 {
-       wxString s, t;
-       bool comma = FALSE;
-
-       s = langDBINF_DB_NAME;
-       s += pDb->dbInf.dbmsName;
-       s += "\n";
-
-       s += langDBINF_DB_VER;
-       s += pDb->dbInf.dbmsVer;
-       s += "\n";
-
-       s += langDBINF_DRIVER_NAME;
-       s += pDb->dbInf.driverName;
-       s += "\n";
-
-       s += langDBINF_DRIVER_ODBC_VER;
-       s += pDb->dbInf.odbcVer;
-       s += "\n";
-
-       s += langDBINF_DRIVER_MGR_ODBC_VER;
-       s += pDb->dbInf.drvMgrOdbcVer;
-       s += "\n";
-
-       s += langDBINF_DRIVER_VER;
-       s += pDb->dbInf.driverVer;
-       s += "\n";
-
-       s += langDBINF_SERVER_NAME;
-       s += pDb->dbInf.serverName;
-       s += "\n";
-
-       s += langDBINF_FILENAME;
-       s += pDb->dbInf.databaseName;
-       s += "\n";
-
-       s += langDBINF_OUTER_JOINS;
-       s += pDb->dbInf.outerJoins;
-       s += "\n";
-
-       s += langDBINF_STORED_PROC;
-       s += pDb->dbInf.procedureSupport;
-       s += "\n";
-
-       if (pDb->dbInf.maxConnections)
-               t.sprintf("%s%d\n", langDBINF_MAX_HDBC, pDb->dbInf.maxConnections);
-       else
-               t.sprintf("%s%s\n", langDBINF_MAX_HDBC, langDBINF_UNLIMITED);
-       s += t;
-
-       if (pDb->dbInf.maxStmts)
-               t.sprintf("%s%d\n", langDBINF_MAX_HSTMT, pDb->dbInf.maxStmts);
-       else
-               t.sprintf("%s%s\n", langDBINF_MAX_HSTMT, langDBINF_UNLIMITED);
-       s += t;
-
-       s += langDBINF_API_LVL;
-       switch(pDb->dbInf.apiConfLvl)
-       {
-               case SQL_OAC_NONE:      s += langDBINF_NONE;            break;
-               case SQL_OAC_LEVEL1:    s += langDBINF_LEVEL1;  break;
-               case SQL_OAC_LEVEL2:    s += langDBINF_LEVEL2;  break;
-       }
-       s += "\n";
-
-       s += langDBINF_CLI_LVL;
-       switch(pDb->dbInf.cliConfLvl)
-       {
-               case SQL_OSCC_NOT_COMPLIANT:    s += langDBINF_NOT_COMPLIANT;   break;
-               case SQL_OSCC_COMPLIANT:                s += langDBINF_COMPLIANT;                       break;
-       }
-       s += "\n";
-
-       s += langDBINF_SQL_LVL;
-       switch(pDb->dbInf.sqlConfLvl)
-       {
-               case SQL_OSC_MINIMUM:   s += langDBINF_MIN_GRAMMAR;     break;
-               case SQL_OSC_CORE:              s += langDBINF_CORE_GRAMMAR;    break;
-               case SQL_OSC_EXTENDED:  s += langDBINF_EXT_GRAMMAR;     break;
-       }
-       s += "\n";
-
-       s += langDBINF_COMMIT_BEHAVIOR;
-       switch(pDb->dbInf.cursorCommitBehavior)
-       {
-               case SQL_CB_DELETE:             s += langDBINF_DELETE_CURSORS;  break;
-               case SQL_CB_CLOSE:              s += langDBINF_CLOSE_CURSORS;           break;
-               case SQL_CB_PRESERVE:   s += langDBINF_PRESERVE_CURSORS;        break;
-       }
-       s += "\n";
-
-       s += langDBINF_ROLLBACK_BEHAVIOR;
-       switch(pDb->dbInf.cursorRollbackBehavior)
-       {
-               case SQL_CB_DELETE:             s += langDBINF_DELETE_CURSORS;  break;
-               case SQL_CB_CLOSE:              s += langDBINF_CLOSE_CURSORS;           break;
-               case SQL_CB_PRESERVE:   s += langDBINF_PRESERVE_CURSORS;        break;
-       }
-       s += "\n";
-
-       s += langDBINF_SUPP_NOT_NULL;
-       switch(pDb->dbInf.supportNotNullClause)
-       {
-               case SQL_NNC_NULL:              s += langNO;    break;
-               case SQL_NNC_NON_NULL:  s += langYES;   break;
-       }
-       s += "\n";
-
-       s += langDBINF_SUPP_IEF;
-       s += pDb->dbInf.supportIEF;
-       s += "\n";
-
-       // DEFAULT setting for "Transaction Isolation Level"
-       s += langDBINF_TXN_ISOLATION;
-       switch(pDb->dbInf.txnIsolation)
-       {
-               case SQL_TXN_READ_UNCOMMITTED:  s += langDBINF_READ_UNCOMMITTED;        break;
-               case SQL_TXN_READ_COMMITTED:            s += langDBINF_READ_COMMITTED;  break;
-               case SQL_TXN_REPEATABLE_READ:           s += langDBINF_REPEATABLE_READ; break;
-               case SQL_TXN_SERIALIZABLE:                      s += langDBINF_SERIALIZABLE;            break;
+    wxString s, t;
+    bool comma;
+
+    s =  wxT("Diagnostics Output\n");
+    s += langDBINF_DB_NAME;
+    s += pDb->dbInf.dbmsName;
+    s += wxT("\n");
+
+    s += langDBINF_DB_VER;
+    s += pDb->dbInf.dbmsVer;
+    s += wxT("\n");
+
+    s += langDBINF_DRIVER_NAME;
+    s += pDb->dbInf.driverName;
+    s += wxT("\n");
+
+    s += langDBINF_DRIVER_ODBC_VER;
+    s += pDb->dbInf.odbcVer;
+    s += wxT("\n");
+
+    s += langDBINF_DRIVER_MGR_ODBC_VER;
+    s += pDb->dbInf.drvMgrOdbcVer;
+    s += wxT("\n");
+
+    s += langDBINF_DRIVER_VER;
+    s += pDb->dbInf.driverVer;
+    s += wxT("\n");
+
+    s += langDBINF_SERVER_NAME;
+    s += pDb->dbInf.serverName;
+    s += wxT("\n");
+
+    s += langDBINF_FILENAME;
+    s += pDb->dbInf.databaseName;
+    s += wxT("\n");
+
+    s += langDBINF_OUTER_JOINS;
+    s += pDb->dbInf.outerJoins;
+    s += wxT("\n");
+
+    s += langDBINF_STORED_PROC;
+    s += pDb->dbInf.procedureSupport;
+    s += wxT("\n");
+
+    if (pDb->dbInf.maxConnections)
+        t.sprintf(wxT("%s%d\n"), langDBINF_MAX_HDBC, pDb->dbInf.maxConnections);
+    else
+        t.sprintf(wxT("%s%s\n"), langDBINF_MAX_HDBC, langDBINF_UNLIMITED);
+    s += t;
+
+    if (pDb->dbInf.maxStmts)
+        t.sprintf(wxT("%s%d\n"), langDBINF_MAX_HSTMT, pDb->dbInf.maxStmts);
+    else
+        t.sprintf(wxT("%s%s\n"), langDBINF_MAX_HSTMT, langDBINF_UNLIMITED);
+    s += t;
+
+    s += langDBINF_API_LVL;
+    switch(pDb->dbInf.apiConfLvl)
+    {
+        case SQL_OAC_NONE:  s += langDBINF_NONE;        break;
+        case SQL_OAC_LEVEL1:    s += langDBINF_LEVEL1;  break;
+        case SQL_OAC_LEVEL2:    s += langDBINF_LEVEL2;  break;
+    }
+    s += wxT("\n");
+
+    s += langDBINF_CLI_LVL;
+    switch(pDb->dbInf.cliConfLvl)
+    {
+        case SQL_OSCC_NOT_COMPLIANT:    s += langDBINF_NOT_COMPLIANT;   break;
+        case SQL_OSCC_COMPLIANT:        s += langDBINF_COMPLIANT;           break;
+    }
+    s += wxT("\n");
+
+    s += langDBINF_SQL_LVL;
+    switch(pDb->dbInf.sqlConfLvl)
+    {
+        case SQL_OSC_MINIMUM:   s += langDBINF_MIN_GRAMMAR; break;
+        case SQL_OSC_CORE:      s += langDBINF_CORE_GRAMMAR;    break;
+        case SQL_OSC_EXTENDED:  s += langDBINF_EXT_GRAMMAR; break;
+    }
+    s += wxT("\n");
+
+    s += langDBINF_COMMIT_BEHAVIOR;
+    switch(pDb->dbInf.cursorCommitBehavior)
+    {
+        case SQL_CB_DELETE:     s += langDBINF_DELETE_CURSORS;  break;
+        case SQL_CB_CLOSE:      s += langDBINF_CLOSE_CURSORS;       break;
+        case SQL_CB_PRESERVE:   s += langDBINF_PRESERVE_CURSORS;    break;
+    }
+    s += wxT("\n");
+
+    s += langDBINF_ROLLBACK_BEHAVIOR;
+    switch(pDb->dbInf.cursorRollbackBehavior)
+    {
+        case SQL_CB_DELETE:     s += langDBINF_DELETE_CURSORS;  break;
+        case SQL_CB_CLOSE:      s += langDBINF_CLOSE_CURSORS;       break;
+        case SQL_CB_PRESERVE:   s += langDBINF_PRESERVE_CURSORS;    break;
+    }
+    s += wxT("\n");
+
+    s += langDBINF_SUPP_NOT_NULL;
+    switch(pDb->dbInf.supportNotNullClause)
+    {
+        case SQL_NNC_NULL:      s += langNO;    break;
+        case SQL_NNC_NON_NULL:  s += langYES;   break;
+    }
+    s += wxT("\n");
+
+    s += langDBINF_SUPP_IEF;
+    s += pDb->dbInf.supportIEF;
+    s += wxT("\n");
+
+    // DEFAULT setting for "Transaction Isolation Level"
+    s += langDBINF_TXN_ISOLATION;
+    switch(pDb->dbInf.txnIsolation)
+    {
+        case SQL_TXN_READ_UNCOMMITTED:  s += langDBINF_READ_UNCOMMITTED;    break;
+        case SQL_TXN_READ_COMMITTED:        s += langDBINF_READ_COMMITTED;  break;
+        case SQL_TXN_REPEATABLE_READ:       s += langDBINF_REPEATABLE_READ; break;
+        case SQL_TXN_SERIALIZABLE:          s += langDBINF_SERIALIZABLE;        break;
 #ifdef ODBC_V20
-               case SQL_TXN_VERSIONING:                        s += langDBINF_VERSIONING;                      break;
-#endif
-       }
-       s += "\n";
-
-       // CURRENT setting for "Transaction Isolation Level"
-       long txnIsoLvl;
-       s += langDBINF_TXN_ISOLATION_CURR;
-       if (SQLGetConnectOption(pDb->GetHDBC(),SQL_TXN_ISOLATION,&txnIsoLvl) == SQL_SUCCESS)
-       {
-               switch(txnIsoLvl)
-               {
-                       case SQL_TXN_READ_UNCOMMITTED:  s += langDBINF_READ_UNCOMMITTED;        break;
-                       case SQL_TXN_READ_COMMITTED:            s += langDBINF_READ_COMMITTED;  break;
-                       case SQL_TXN_REPEATABLE_READ:           s += langDBINF_REPEATABLE_READ; break;
-                       case SQL_TXN_SERIALIZABLE:                      s += langDBINF_SERIALIZABLE;            break;
+        case SQL_TXN_VERSIONING:            s += langDBINF_VERSIONING;          break;
+#endif
+    }
+    s += wxT("\n");
+
+    // CURRENT setting for "Transaction Isolation Level"
+    long txnIsoLvl;
+    s += langDBINF_TXN_ISOLATION_CURR;
+    if (SQLGetConnectOption(pDb->GetHDBC(),SQL_TXN_ISOLATION,&txnIsoLvl) == SQL_SUCCESS)
+    {
+        switch(txnIsoLvl)
+        {
+            case SQL_TXN_READ_UNCOMMITTED:  s += langDBINF_READ_UNCOMMITTED;    break;
+            case SQL_TXN_READ_COMMITTED:        s += langDBINF_READ_COMMITTED;  break;
+            case SQL_TXN_REPEATABLE_READ:       s += langDBINF_REPEATABLE_READ; break;
+            case SQL_TXN_SERIALIZABLE:          s += langDBINF_SERIALIZABLE;        break;
 #ifdef ODBC_V20
-                       case SQL_TXN_VERSIONING:                        s += langDBINF_VERSIONING;                      break;
-#endif
-               }
-       }
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_TXN_ISOLATION_OPTS;
-       if (pDb->dbInf.txnIsolationOptions & SQL_TXN_READ_UNCOMMITTED)
-               {s += langDBINF_READ_UNCOMMITTED; comma++;}
-       if (pDb->dbInf.txnIsolationOptions & SQL_TXN_READ_COMMITTED)
-               {if (comma++) s += ", "; s += langDBINF_READ_COMMITTED;}
-       if (pDb->dbInf.txnIsolationOptions & SQL_TXN_REPEATABLE_READ)
-               {if (comma++) s += ", "; s += langDBINF_REPEATABLE_READ;}
-       if (pDb->dbInf.txnIsolationOptions & SQL_TXN_SERIALIZABLE)
-               {if (comma++) s += ", "; s += langDBINF_SERIALIZABLE;}
+            case SQL_TXN_VERSIONING:            s += langDBINF_VERSIONING;          break;
+#endif
+        }
+    }
+    s += wxT("\n");
+
+#ifdef __VMS__
+#pragma message disable incboodep
+#endif
+    comma = false;
+    s += langDBINF_TXN_ISOLATION_OPTS;
+    if (pDb->dbInf.txnIsolationOptions & SQL_TXN_READ_UNCOMMITTED)
+        {s += langDBINF_READ_UNCOMMITTED; comma++;}
+    if (pDb->dbInf.txnIsolationOptions & SQL_TXN_READ_COMMITTED)
+        {if (comma++) s += wxT(", "); s += langDBINF_READ_COMMITTED;}
+    if (pDb->dbInf.txnIsolationOptions & SQL_TXN_REPEATABLE_READ)
+        {if (comma++) s += wxT(", "); s += langDBINF_REPEATABLE_READ;}
+    if (pDb->dbInf.txnIsolationOptions & SQL_TXN_SERIALIZABLE)
+        {if (comma++) s += wxT(", "); s += langDBINF_SERIALIZABLE;}
 #ifdef ODBC_V20
-       if (pDb->dbInf.txnIsolationOptions & SQL_TXN_VERSIONING)
-               {if (comma++) s += ", "; s += langDBINF_VERSIONING;}
-#endif
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_FETCH_DIRS;
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_NEXT)
-               {s += langDBINF_NEXT; comma++;}
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_PRIOR)
-               {if (comma++) s += ", "; s += langDBINF_PREV;}
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_FIRST)
-               {if (comma++) s += ", "; s += langDBINF_FIRST;}
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_LAST)
-               {if (comma++) s += ", "; s += langDBINF_LAST;}
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_ABSOLUTE)
-               {if (comma++) s += ", "; s += langDBINF_ABSOLUTE;}
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_RELATIVE)
-               {if (comma++) s += ", "; s += langDBINF_RELATIVE;}
+    if (pDb->dbInf.txnIsolationOptions & SQL_TXN_VERSIONING)
+        {if (comma++) s += wxT(", "); s += langDBINF_VERSIONING;}
+#endif
+    s += wxT("\n");
+
+    comma = false;
+    s += langDBINF_FETCH_DIRS;
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_NEXT)
+        {s += langDBINF_NEXT; comma++;}
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_PRIOR)
+        {if (comma++) s += wxT(", "); s += langDBINF_PREV;}
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_FIRST)
+        {if (comma++) s += wxT(", "); s += langDBINF_FIRST;}
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_LAST)
+        {if (comma++) s += wxT(", "); s += langDBINF_LAST;}
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_ABSOLUTE)
+        {if (comma++) s += wxT(", "); s += langDBINF_ABSOLUTE;}
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_RELATIVE)
+        {if (comma++) s += wxT(", "); s += langDBINF_RELATIVE;}
 #ifdef ODBC_V20
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_RESUME)
-               {if (comma++) s += ", "; s += langDBINF_RESUME;}
-#endif
-       if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_BOOKMARK)
-               {if (comma++) s += ", "; s += langDBINF_BOOKMARK;}
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_LOCK_TYPES;
-       if (pDb->dbInf.lockTypes & SQL_LCK_NO_CHANGE)
-               {s += langDBINF_NO_CHANGE; comma++;}
-       if (pDb->dbInf.lockTypes & SQL_LCK_EXCLUSIVE)
-               {if (comma++) s += ", "; s += langDBINF_EXCLUSIVE;}
-       if (pDb->dbInf.lockTypes & SQL_LCK_UNLOCK)
-               {if (comma++) s += ", "; s += langDBINF_UNLOCK;}
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_POS_OPERS;
-       if (pDb->dbInf.posOperations & SQL_POS_POSITION)
-               {s += langDBINF_POSITION; comma++;}
-       if (pDb->dbInf.posOperations & SQL_POS_REFRESH)
-               {if (comma++) s += ", "; s += langDBINF_REFRESH;}
-       if (pDb->dbInf.posOperations & SQL_POS_UPDATE)
-               {if (comma++) s += ", "; s += langDBINF_UPD;}
-       if (pDb->dbInf.posOperations & SQL_POS_DELETE)
-               {if (comma++) s += ", "; s += langDBINF_DEL;}
-       if (pDb->dbInf.posOperations & SQL_POS_ADD)
-               {if (comma++) s += ", "; s += langDBINF_ADD;}
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_POS_STMTS;
-       if (pDb->dbInf.posStmts & SQL_PS_POSITIONED_DELETE)
-               {s += langDBINF_POS_DEL; comma++;}
-       if (pDb->dbInf.posStmts & SQL_PS_POSITIONED_UPDATE)
-               {if (comma++) s += ", "; s += langDBINF_POS_UPD;}
-       if (pDb->dbInf.posStmts & SQL_PS_SELECT_FOR_UPDATE)
-               {if (comma++) s += ", "; s += langDBINF_SELECT_FOR_UPD;}
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_SCROLL_CONCURR;
-       if (pDb->dbInf.scrollConcurrency & SQL_SCCO_READ_ONLY)
-               {s += langDBINF_READ_ONLY; comma++;}
-       if (pDb->dbInf.scrollConcurrency & SQL_SCCO_LOCK)
-               {if (comma++) s += ", "; s += langDBINF_LOCK;}
-       if (pDb->dbInf.scrollConcurrency & SQL_SCCO_OPT_ROWVER)
-               {if (comma++) s += ", "; s += langDBINF_OPT_ROWVER;}
-       if (pDb->dbInf.scrollConcurrency & SQL_SCCO_OPT_VALUES)
-               {if (comma++) s += ", "; s += langDBINF_OPT_VALUES;}
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_SCROLL_OPTS;
-       if (pDb->dbInf.scrollOptions & SQL_SO_FORWARD_ONLY)
-               {s += langDBINF_FWD_ONLY; comma++;}
-       if (pDb->dbInf.scrollOptions & SQL_SO_STATIC)
-               {if (comma++) s += ", "; s += langDBINF_STATIC;}
-       if (pDb->dbInf.scrollOptions & SQL_SO_KEYSET_DRIVEN)
-               {if (comma++) s += ", "; s += langDBINF_KEYSET_DRIVEN;}
-       if (pDb->dbInf.scrollOptions & SQL_SO_DYNAMIC)
-               {if (comma++) s += ", "; s += langDBINF_DYNAMIC;}
-       if (pDb->dbInf.scrollOptions & SQL_SO_MIXED)
-               {if (comma++) s += ", "; s += langDBINF_MIXED;}
-       s += "\n";
-
-       comma = FALSE;
-       s += langDBINF_STATIC_SENS;
-       if (pDb->dbInf.staticSensitivity & SQL_SS_ADDITIONS)
-               {s += langDBINF_ADDITIONS; comma++;}
-       if (pDb->dbInf.staticSensitivity & SQL_SS_DELETIONS)
-               {if (comma++) s += ", "; s += langDBINF_DELETIONS;}
-       if (pDb->dbInf.staticSensitivity & SQL_SS_UPDATES)
-               {if (comma++) s += ", "; s += langDBINF_UPDATES;}
-       s += "\n";
-
-
-       s += langDBINF_TXN_CAPABLE;
-       switch(pDb->dbInf.txnCapable)
-       {
-               case SQL_TC_NONE:                       s += langNO;                                            break;
-               case SQL_TC_DML:                        s += langDBINF_DML_ONLY;                break;
-               case SQL_TC_DDL_COMMIT: s += langDBINF_DDL_COMMIT;              break;
-               case SQL_TC_DDL_IGNORE: s += langDBINF_DDL_IGNORE;              break;
-               case SQL_TC_ALL:                        s += langDBINF_DDL_AND_DML;     break;
-       }
-       s += "\n";
-
-       t.sprintf("%s%d\n", langDBINF_LOGIN_TIMEOUT, pDb->dbInf.loginTimeout);
-       s += t;
-
-       // Oracle specific information
-       if (pDb->Dbms() == dbmsORACLE)
-       {
-               s += "\n";
-               s += langDBINF_ORACLE_BANNER;
-               s += "\n";
-
-               // Oracle cache hit ratio
-               SDWORD cb;
-               ULONG dbBlockGets;
-               pDb->ExecSql("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'db block gets'");
-               pDb->GetNext();
-               if (pDb->GetData(1, SQL_C_ULONG, &dbBlockGets, 0, &cb))
-               {
-                       t.sprintf("%s: %lu\n", langDBINF_DB_BLOCK_GETS, dbBlockGets);
-                       s += t;
-               }
-
-               ULONG consistentGets;
-               pDb->ExecSql("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'consistent gets'");
-               pDb->GetNext();
-               if (pDb->GetData(1, SQL_C_ULONG, &consistentGets, 0, &cb))
-               {
-                       t.sprintf("%s: %lu\n", langDBINF_CONSISTENT_GETS, consistentGets);
-                       s += t;
-               }
-
-               ULONG physReads;
-               pDb->ExecSql("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'physical reads'");
-               pDb->GetNext();
-               if (pDb->GetData(1, SQL_C_ULONG, &physReads, 0, &cb))
-               {
-                       t.sprintf("%s: %lu\n", langDBINF_PHYSICAL_READS, physReads);
-                       s += t;
-               }
-
-               ULONG hitRatio = (ULONG)((1.00 - ((float)physReads / (float)(dbBlockGets + consistentGets))) * 100.00);
-               t.sprintf("*** %s: %lu%%\n", langDBINF_CACHE_HIT_RATIO, hitRatio);
-               s += t;
-
-               // Tablespace information
-               s += "\n";
-               s += langDBINF_TABLESPACE_IO;
-               s += "\n";
-               ULONG physWrites;
-               char tablespaceName[257];
-               pDb->ExecSql("SELECT NAME,PHYRDS,PHYWRTS FROM V$DATAFILE, V$FILESTAT WHERE V$DATAFILE.FILE# = V$FILESTAT.FILE#");
-               while (pDb->GetNext())
-               {
-                       pDb->GetData(1, SQL_C_CHAR,  tablespaceName, 257, &cb);
-                       pDb->GetData(2, SQL_C_ULONG, &physReads,     0,   &cb);
-                       pDb->GetData(3, SQL_C_ULONG, &physWrites,    0,   &cb);
-                       t.sprintf("%s\n\t%s: %lu\t%s: %lu\n", tablespaceName,
-                               langDBINF_PHYSICAL_READS, physReads, langDBINF_PHYSICAL_WRITES, physWrites);
-                       s += t;
-               }
-
-               s += "\n";
-       }
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_RESUME)
+        {if (comma++) s += wxT(", "); s += langDBINF_RESUME;}
+#endif
+    if (pDb->dbInf.fetchDirections & SQL_FD_FETCH_BOOKMARK)
+        {if (comma++) s += wxT(", "); s += langDBINF_BOOKMARK;}
+    s += wxT("\n");
+
+    comma = false;
+    s += langDBINF_LOCK_TYPES;
+    if (pDb->dbInf.lockTypes & SQL_LCK_NO_CHANGE)
+        {s += langDBINF_NO_CHANGE; comma++;}
+    if (pDb->dbInf.lockTypes & SQL_LCK_EXCLUSIVE)
+        {if (comma++) s += wxT(", "); s += langDBINF_EXCLUSIVE;}
+    if (pDb->dbInf.lockTypes & SQL_LCK_UNLOCK)
+        {if (comma++) s += wxT(", "); s += langDBINF_UNLOCK;}
+    s += wxT("\n");
+
+    comma = false;
+    s += langDBINF_POS_OPERS;
+    if (pDb->dbInf.posOperations & SQL_POS_POSITION)
+        {s += langDBINF_POSITION; comma++;}
+    if (pDb->dbInf.posOperations & SQL_POS_REFRESH)
+        {if (comma++) s += wxT(", "); s += langDBINF_REFRESH;}
+    if (pDb->dbInf.posOperations & SQL_POS_UPDATE)
+        {if (comma++) s += wxT(", "); s += langDBINF_UPD;}
+    if (pDb->dbInf.posOperations & SQL_POS_DELETE)
+        {if (comma++) s += wxT(", "); s += langDBINF_DEL;}
+    if (pDb->dbInf.posOperations & SQL_POS_ADD)
+        {if (comma++) s += wxT(", "); s += langDBINF_ADD;}
+    s += wxT("\n");
+
+    comma = false;
+    s += langDBINF_POS_STMTS;
+    if (pDb->dbInf.posStmts & SQL_PS_POSITIONED_DELETE)
+        {s += langDBINF_POS_DEL; comma++;}
+    if (pDb->dbInf.posStmts & SQL_PS_POSITIONED_UPDATE)
+        {if (comma++) s += wxT(", "); s += langDBINF_POS_UPD;}
+    if (pDb->dbInf.posStmts & SQL_PS_SELECT_FOR_UPDATE)
+        {if (comma++) s += wxT(", "); s += langDBINF_SELECT_FOR_UPD;}
+    s += wxT("\n");
+
+    comma = false;
+    s += langDBINF_SCROLL_CONCURR;
+    if (pDb->dbInf.scrollConcurrency & SQL_SCCO_READ_ONLY)
+        {s += langDBINF_READ_ONLY; comma++;}
+    if (pDb->dbInf.scrollConcurrency & SQL_SCCO_LOCK)
+        {if (comma++) s += wxT(", "); s += langDBINF_LOCK;}
+    if (pDb->dbInf.scrollConcurrency & SQL_SCCO_OPT_ROWVER)
+        {if (comma++) s += wxT(", "); s += langDBINF_OPT_ROWVER;}
+    if (pDb->dbInf.scrollConcurrency & SQL_SCCO_OPT_VALUES)
+        {if (comma++) s += wxT(", "); s += langDBINF_OPT_VALUES;}
+    s += wxT("\n");
+
+    comma = false;
+    s += langDBINF_SCROLL_OPTS;
+    if (pDb->dbInf.scrollOptions & SQL_SO_FORWARD_ONLY)
+        {s += langDBINF_FWD_ONLY; comma++;}
+    if (pDb->dbInf.scrollOptions & SQL_SO_STATIC)
+        {if (comma++) s += wxT(", "); s += langDBINF_STATIC;}
+    if (pDb->dbInf.scrollOptions & SQL_SO_KEYSET_DRIVEN)
+        {if (comma++) s += wxT(", "); s += langDBINF_KEYSET_DRIVEN;}
+    if (pDb->dbInf.scrollOptions & SQL_SO_DYNAMIC)
+        {if (comma++) s += wxT(", "); s += langDBINF_DYNAMIC;}
+    if (pDb->dbInf.scrollOptions & SQL_SO_MIXED)
+        {if (comma++) s += wxT(", "); s += langDBINF_MIXED;}
+    s += wxT("\n");
+
+    comma = false;
+    s += langDBINF_STATIC_SENS;
+    if (pDb->dbInf.staticSensitivity & SQL_SS_ADDITIONS)
+        {s += langDBINF_ADDITIONS; comma++;}
+    if (pDb->dbInf.staticSensitivity & SQL_SS_DELETIONS)
+        {if (comma++) s += wxT(", "); s += langDBINF_DELETIONS;}
+    if (pDb->dbInf.staticSensitivity & SQL_SS_UPDATES)
+        {if (comma++) s += wxT(", "); s += langDBINF_UPDATES;}
+    s += wxT("\n");
+#ifdef __VMS__
+#pragma message enable incboodep
+#endif
+
+
+    s += langDBINF_TXN_CAPABLE;
+    switch(pDb->dbInf.txnCapable)
+    {
+        case SQL_TC_NONE:           s += langNO;                        break;
+        case SQL_TC_DML:            s += langDBINF_DML_ONLY;        break;
+        case SQL_TC_DDL_COMMIT: s += langDBINF_DDL_COMMIT;      break;
+        case SQL_TC_DDL_IGNORE: s += langDBINF_DDL_IGNORE;      break;
+        case SQL_TC_ALL:            s += langDBINF_DDL_AND_DML; break;
+    }
+    s += wxT("\n");
+
+    t.sprintf(wxT("%s%lu\n"), langDBINF_LOGIN_TIMEOUT, pDb->dbInf.loginTimeout);
+    s += t;
+
+    // Oracle specific information
+    if (pDb->Dbms() == dbmsORACLE)
+    {
+        s += wxT("\n");
+        s += langDBINF_ORACLE_BANNER;
+        s += wxT("\n");
+
+        // Oracle cache hit ratio
+        SDWORD cb;
+        ULONG dbBlockGets;
+        pDb->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'db block gets'"));
+        pDb->GetNext();
+        if (pDb->GetData(1, SQL_C_ULONG, &dbBlockGets, 0, &cb))
+        {
+            t.sprintf(wxT("%s: %lu\n"), langDBINF_DB_BLOCK_GETS, dbBlockGets);
+            s += t;
+        }
 
+        ULONG consistentGets;
+        pDb->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'consistent gets'"));
+        pDb->GetNext();
+        if (pDb->GetData(1, SQL_C_ULONG, &consistentGets, 0, &cb))
+        {
+            t.sprintf(wxT("%s: %lu\n"), langDBINF_CONSISTENT_GETS, consistentGets);
+            s += t;
+        }
+
+        ULONG physReads;
+        pDb->ExecSql(wxT("SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'physical reads'"));
+        pDb->GetNext();
+        if (pDb->GetData(1, SQL_C_ULONG, &physReads, 0, &cb))
+        {
+            t.sprintf(wxT("%s: %lu\n"), langDBINF_PHYSICAL_READS, physReads);
+            s += t;
+        }
+
+        ULONG hitRatio = (ULONG)((1.00 - ((float)physReads / (float)(dbBlockGets + consistentGets))) * 100.00);
+        t.sprintf(wxT("*** %s: %lu%%\n"), langDBINF_CACHE_HIT_RATIO, hitRatio);
+        s += t;
+
+        // Tablespace information
+        s += wxT("\n");
+        s += langDBINF_TABLESPACE_IO;
+        s += wxT("\n");
+        ULONG physWrites;
+        char tablespaceName[257];
+        pDb->ExecSql(wxT("SELECT NAME,PHYRDS,PHYWRTS FROM V$DATAFILE, V$FILESTAT WHERE V$DATAFILE.FILE# = V$FILESTAT.FILE#"));
+        while (pDb->GetNext())
+        {
+            pDb->GetData(1, SQL_C_CHAR,  tablespaceName, 257, &cb);
+            pDb->GetData(2, SQL_C_ULONG, &physReads,     0,   &cb);
+            pDb->GetData(3, SQL_C_ULONG, &physWrites,    0,   &cb);
+            t.sprintf(wxT("%s\n\t%s: %lu\t%s: %lu\n"), tablespaceName,
+                langDBINF_PHYSICAL_READS, physReads, langDBINF_PHYSICAL_WRITES, physWrites);
+            s += t;
+        }
+
+        s += wxT("\n");
+    }
+
+    s += wxT("End of Diagnostics\n");
     wxLogMessage(s);
 
 }  // DisplayDbDiagnostics()
 
+#if wxUSE_GRID
+
+BEGIN_EVENT_TABLE(DbGridFrame, wxFrame)
+ //   EVT_CLOSE(DbGridFrame::OnCloseWindow)
+END_EVENT_TABLE()
+
+
+DbGridFrame::DbGridFrame(wxWindow *parent)
+    : wxFrame (parent, wxID_ANY, wxT("Database Table"),
+               wxDefaultPosition, wxSize(400, 325))
+{
+    initialized = false;
+}
+
+
+void DbGridFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
+{
+    this->Destroy();
+}
+
+
+bool DbGridFrame::Initialize()
+{
+    wxGrid *grid = new wxGrid(this, wxID_ANY, wxDefaultPosition);
+
+    grid->RegisterDataType(wxGRID_VALUE_DATETIME,
+                             new wxGridCellDateTimeRenderer(wxT("%d %b %Y")),
+                             new wxGridCellTextEditor);
+#ifdef CHOICEINT
+    grid->RegisterDataType(wxGRID_VALUE_CHOICEINT,
+                             new wxGridCellEnumRenderer,
+                             new wxGridCellEnumEditor);
+                             
+    wxString NativeLangChoice( wxString::Format(wxT("%s:%s,%s,%s,%s,%s"),wxGRID_VALUE_CHOICEINT, 
+                            wxT("English"),
+                            wxT("French"),
+                            wxT("German"),
+                            wxT("Spanish"),
+                            wxT("Other") )); 
+#endif
+
+    // Columns must match the sequence specified in SetColDef() calls
+    wxDbGridColInfo* cols =
+        new wxDbGridColInfo( 0,wxGRID_VALUE_STRING,wxT("Name"),
+        new wxDbGridColInfo( 1,wxGRID_VALUE_STRING,wxT("Address 1"),
+        new wxDbGridColInfo( 2,wxGRID_VALUE_STRING,wxT("Address 2"),
+        new wxDbGridColInfo( 3,wxGRID_VALUE_STRING,wxT("City"),
+        new wxDbGridColInfo( 4,wxGRID_VALUE_STRING,wxT("State"),
+        new wxDbGridColInfo( 5,wxGRID_VALUE_STRING,wxT("PostCode"),
+        new wxDbGridColInfo( 6,wxGRID_VALUE_STRING,wxT("Country"),
+        new wxDbGridColInfo( 7,wxGRID_VALUE_DBAUTO,wxT("Join Date"),
+        new wxDbGridColInfo( 8,wxGRID_VALUE_BOOL,  wxT("Developer"),
+        new wxDbGridColInfo( 9,wxGRID_VALUE_NUMBER,wxT("Contributions"),
+        new wxDbGridColInfo(10,wxGRID_VALUE_NUMBER,wxT("Lines Of Code"),
+#ifdef CHOICEINT
+        new wxDbGridColInfo(11,NativeLangChoice,   wxT("Native Language"),NULL))))))))))));
+#else        
+        new wxDbGridColInfo(11,wxGRID_VALUE_NUMBER,wxT("Native Language"),NULL))))))))))));
+#endif
+
+    Ccontact *Contact = new Ccontact();
+    //wxGetApp().Contact
+
+    if (!Contact)
+    {
+        wxMessageBox(wxT("Unable to instantiate an instance of Ccontact"), wxT("Error..."), wxOK | wxICON_EXCLAMATION);
+        return false;
+    }
+
+    if (!Contact->Open())
+    {
+        if (Contact->GetDb()->TableExists(CONTACT_TABLE_NAME, Contact->GetDb()->GetUsername(),
+                                          wxGetApp().DbConnectInf->GetDefaultDir()))
+        {
+            wxString tStr;
+            tStr.Printf(wxT("Unable to open the table '%s'.\n\n"),CONTACT_TABLE_NAME);
+            wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                         wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+        }
+
+        return false;
+    }
+
+    // Execute the following query using the cursor designated
+    // for full table query
+    Contact->SetRowMode(wxDbTable::WX_ROW_MODE_QUERY);
+
+    if (!Contact->Query())
+    {
+        wxString tStr;
+        tStr = wxT("ODBC error during Query()\n\n");
+        wxMessageBox(wxDbLogExtendedErrorMsg(tStr.c_str(),wxGetApp().Contact->GetDb(),__TFILE__,__LINE__),
+                     wxT("ODBC Error..."),wxOK | wxICON_EXCLAMATION);
+        return false;
+    }
+
+    // No data has been read in from the database yet, so
+    // we need to initialize the data members to valid values
+    // so Fit() can correctly size the grid
+    Contact->Initialize();
+
+    wxDbGridTableBase* db = new wxDbGridTableBase(Contact, cols, wxUSE_QUERY, true);
+
+    delete cols;
+
+    grid->SetTable(db,true);
+    grid->SetMargins(0, 0);
 
+    grid->Fit();
+    wxSize size = grid->GetSize();
+    size.x += 10;
+    size.y += 10;
+    SetClientSize(size);
+    initialized = true;
+    return true;
+}  // DbGridFrame::Initialize()
 
+#endif // #if wxUSE_GRID
 
 /*
     TEST CODE FOR TESTING THE wxDbCreateDataSource() FUNCTION
 
         int result = 0;
-        result = wxDbCreateDataSource(wxT("Microsoft Access Driver (*.mdb)"),wxT("GLT-TEST2"),wxT("GLT-Descrip"),FALSE,wxT(""),this);
+        result = wxDbCreateDataSource(wxT("Microsoft Access Driver (*.mdb)"),wxT("GLT-TEST2"),wxT("GLT-Descrip"),false,wxT(""),this);
         if (!result)
         {
             // check for errors caused by ConfigDSN based functions