+/********** wxDbTable::BuildUpdateStmt() **********/
+void wxDbTable::BuildUpdateStmt(wxString &pSqlStmt, int typeOfUpdate, const wxString &pWhereClause)
+{
+    wxASSERT(!queryOnly);
+    if (queryOnly)
+        return;
+
+    wxString whereClause;
+    whereClause.Empty();
+
+    bool firstColumn = true;
+
+    pSqlStmt.Printf(wxT("UPDATE %s SET "),
+                    pDb->SQLTableName(tableName.c_str()).c_str());
+
+    // Append a list of columns to be updated
+    int i;
+    for (i = 0; i < m_numCols; i++)
+    {
+        // Only append Updateable columns
+        if (colDefs[i].Updateable)
+        {
+            if (!firstColumn)
+                pSqlStmt += wxT(",");
+            else
+                firstColumn = false;
+
+            pSqlStmt += pDb->SQLColumnName(colDefs[i].ColName);
+//            pSqlStmt += colDefs[i].ColName;
+            pSqlStmt += wxT(" = ?");
+        }
+    }
+
+    // Append the WHERE clause to the SQL UPDATE statement
+    pSqlStmt += wxT(" WHERE ");
+    switch(typeOfUpdate)
+    {
+        case DB_UPD_KEYFIELDS:
+            // If the datasource supports the ROWID column, build
+            // the where on ROWID for efficiency purposes.
+            // e.g. UPDATE PARTS SET Col1 = ?, Col2 = ? WHERE ROWID = '111.222.333'
+            if (CanUpdateByROWID())
+            {
+                SDWORD cb;
+                wxChar rowid[wxDB_ROWID_LEN+1];
+
+                // Get the ROWID value.  If not successful retreiving the ROWID,
+                // simply fall down through the code and build the WHERE clause
+                // based on the key fields.
+                if (SQLGetData(hstmt, (UWORD)(m_numCols+1), SQL_C_WXCHAR, (UCHAR*) rowid, sizeof(rowid), &cb) == SQL_SUCCESS)
+                {
+                    pSqlStmt += wxT("ROWID = '");
+                    pSqlStmt += rowid;
+                    pSqlStmt += wxT("'");
+                    break;
+                }
+            }
+            // Unable to delete by ROWID, so build a WHERE
+            // clause based on the keyfields.
+            BuildWhereClause(whereClause, DB_WHERE_KEYFIELDS);
+            pSqlStmt += whereClause;
+            break;
+        case DB_UPD_WHERE:
+            pSqlStmt += pWhereClause;
+            break;
+    }
+}  // BuildUpdateStmt()
+
+
+/***** DEPRECATED: use wxDbTable::BuildUpdateStmt(wxString &....) form *****/
+void wxDbTable::BuildUpdateStmt(wxChar *pSqlStmt, int typeOfUpdate, const wxString &pWhereClause)
+{
+    wxString tempSqlStmt;
+    BuildUpdateStmt(tempSqlStmt, typeOfUpdate, pWhereClause);
+    wxStrcpy(pSqlStmt, tempSqlStmt);
+}  // BuildUpdateStmt()
+
+
+/********** wxDbTable::BuildWhereClause() **********/
+void wxDbTable::BuildWhereClause(wxString &pWhereClause, int typeOfWhere,
+                                 const wxString &qualTableName, bool useLikeComparison)
+/*
+ * Note: BuildWhereClause() currently ignores timestamp columns.
+ *       They are not included as part of the where clause.
+ */
+{
+    bool moreThanOneColumn = false;
+    wxString colValue;
+
+    // Loop through the columns building a where clause as you go
+    int colNumber;
+    for (colNumber = 0; colNumber < m_numCols; colNumber++)
+    {
+        // Determine if this column should be included in the WHERE clause
+        if ((typeOfWhere == DB_WHERE_KEYFIELDS && colDefs[colNumber].KeyField) ||
+             (typeOfWhere == DB_WHERE_MATCHING  && (!IsColNull((UWORD)colNumber))))
+        {
+            // Skip over timestamp columns
+            if (colDefs[colNumber].SqlCtype == SQL_C_TIMESTAMP)
+                continue;
+            // If there is more than 1 column, join them with the keyword "AND"
+            if (moreThanOneColumn)
+                pWhereClause += wxT(" AND ");
+            else
+                moreThanOneColumn = true;
+
+            // Concatenate where phrase for the column
+            wxString tStr = colDefs[colNumber].ColName;
+
+            if (qualTableName.Length() && tStr.Find(wxT('.')) == wxNOT_FOUND)
+            {
+                pWhereClause += pDb->SQLTableName(qualTableName);
+                pWhereClause += wxT(".");
+            }
+            pWhereClause += pDb->SQLColumnName(colDefs[colNumber].ColName);
+
+            if (useLikeComparison && (colDefs[colNumber].SqlCtype == SQL_C_WXCHAR))
+                pWhereClause += wxT(" LIKE ");
+            else
+                pWhereClause += wxT(" = ");
+
+            switch(colDefs[colNumber].SqlCtype)
+            {
+                case SQL_C_CHAR:
+#ifdef SQL_C_WCHAR
+                case SQL_C_WCHAR:
+#endif
+                //case SQL_C_WXCHAR:  SQL_C_WXCHAR is covered by either SQL_C_CHAR or SQL_C_WCHAR
+                    colValue.Printf(wxT("'%s'"), (UCHAR FAR *) colDefs[colNumber].PtrDataObj);
+                    break;
+                case SQL_C_SHORT:
+                case SQL_C_SSHORT:
+                    colValue.Printf(wxT("%hi"), *((SWORD *) colDefs[colNumber].PtrDataObj));
+                    break;
+                case SQL_C_USHORT:
+                    colValue.Printf(wxT("%hu"), *((UWORD *) colDefs[colNumber].PtrDataObj));
+                    break;
+                case SQL_C_LONG:
+                case SQL_C_SLONG:
+                    colValue.Printf(wxT("%li"), *((SDWORD *) colDefs[colNumber].PtrDataObj));
+                    break;
+                case SQL_C_ULONG:
+                    colValue.Printf(wxT("%lu"), *((UDWORD *) colDefs[colNumber].PtrDataObj));
+                    break;
+                case SQL_C_FLOAT:
+                    colValue.Printf(wxT("%.6f"), *((SFLOAT *) colDefs[colNumber].PtrDataObj));
+                    break;
+                case SQL_C_DOUBLE:
+                    colValue.Printf(wxT("%.6f"), *((SDOUBLE *) colDefs[colNumber].PtrDataObj));
+                    break;
+                default:
+                    {
+                        wxString strMsg;
+                        strMsg.Printf(wxT("wxDbTable::bindParams(): Unknown column type for colDefs %d colName %s"),
+                                    colNumber,colDefs[colNumber].ColName);
+                        wxFAIL_MSG(strMsg.c_str());
+                    }
+                    break;
+            }
+            pWhereClause += colValue;
+        }
+    }
+}  // wxDbTable::BuildWhereClause()
+
+
+/***** DEPRECATED: use wxDbTable::BuildWhereClause(wxString &....) form *****/
+void wxDbTable::BuildWhereClause(wxChar *pWhereClause, int typeOfWhere,
+                                 const wxString &qualTableName, bool useLikeComparison)
+{
+    wxString tempSqlStmt;
+    BuildWhereClause(tempSqlStmt, typeOfWhere, qualTableName, useLikeComparison);
+    wxStrcpy(pWhereClause, tempSqlStmt);
+}  // wxDbTable::BuildWhereClause()
+
+
+/********** wxDbTable::GetRowNum() **********/
+UWORD wxDbTable::GetRowNum(void)