X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4e45573151c64a0a9d423eca7b29879640b9d77..a9decf2374b39789cd8f66b0348fba46ff2915c0:/src/common/db.cpp diff --git a/src/common/db.cpp b/src/common/db.cpp index da7698256d..1cc07c08f1 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -1013,8 +1013,8 @@ bool wxDb::setConnectionOptions(void) if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) return(DispAllErrors(henv, hdbc)); - retcode = SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF); - retcode = SQLSetConnectOption(hdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF); + /* retcode = */ SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF); + /* retcode = */ SQLSetConnectOption(hdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF); // SQLSetConnectOption(hdbc, SQL_TXN_ISOLATION, SQL_TXN_READ_COMMITTED); // No dirty reads // By default, MS Sql Server closes cursors on commit and rollback. The following @@ -1026,7 +1026,7 @@ bool wxDb::setConnectionOptions(void) { const long SQL_PRESERVE_CURSORS = 1204L; const long SQL_PC_ON = 1L; - retcode = SQLSetConnectOption(hdbc, SQL_PRESERVE_CURSORS, SQL_PC_ON); + /* retcode = */ SQLSetConnectOption(hdbc, SQL_PRESERVE_CURSORS, SQL_PC_ON); } // Display the connection options to verify them @@ -2163,6 +2163,93 @@ bool wxDb::ExecSql(const wxString &pSqlStmt) } // wxDb::ExecSql() +/********** wxDb::ExecSql() with column info **********/ +bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcols) +{ + //execute the statement first + if (!ExecSql(pSqlStmt)) + return false; + + SWORD noCols; + if (SQLNumResultCols(hstmt, &noCols) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + return false; + } + + if (noCols == 0) + return false; + else + numcols = noCols; + + // Get column information + short colNum; + wxChar name[DB_MAX_COLUMN_NAME_LEN+1]; + SWORD Sword; + SDWORD Sdword; + wxDbColInf* pColInf = new wxDbColInf[noCols]; + + //fill in column information (name, datatype) + for (colNum = 0; colNum < noCols; colNum++) + { + if (SQLColAttributes(hstmt, (UWORD)(colNum+1), SQL_COLUMN_NAME, + name, sizeof(name), + &Sword, &Sdword) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + delete[] pColInf; + return false; + } + + wxStrncpy(pColInf[colNum].colName, name, DB_MAX_COLUMN_NAME_LEN); + + if (SQLColAttributes(hstmt, (UWORD)(colNum+1), SQL_COLUMN_TYPE, + NULL, 0, &Sword, &Sdword) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + delete[] pColInf; + return false; + } + + switch (Sdword) + { + case SQL_VARCHAR: + case SQL_CHAR: + pColInf[colNum].dbDataType = DB_DATA_TYPE_VARCHAR; + break; + case SQL_TINYINT: + case SQL_SMALLINT: + case SQL_INTEGER: + case SQL_BIT: + pColInf[colNum].dbDataType = DB_DATA_TYPE_INTEGER; + break; + case SQL_DOUBLE: + case SQL_DECIMAL: + case SQL_NUMERIC: + case SQL_FLOAT: + case SQL_REAL: + pColInf[colNum].dbDataType = DB_DATA_TYPE_FLOAT; + break; + case SQL_DATE: + case SQL_TIMESTAMP: + pColInf[colNum].dbDataType = DB_DATA_TYPE_DATE; + break; + case SQL_BINARY: + pColInf[colNum].dbDataType = DB_DATA_TYPE_BLOB; + break; +#ifdef __WXDEBUG__ + default: + wxString errMsg; + errMsg.Printf(wxT("SQL Data type %ld currently not supported by wxWidgets"), (long)Sdword); + wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE")); +#endif + } + } + + *columns = pColInf; + return true; +} // wxDb::ExecSql() + /********** wxDb::GetNext() **********/ bool wxDb::GetNext(void) { @@ -2284,7 +2371,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo } // while tempStr.Trim(); // Get rid of any unneeded blanks - if (!tempStr.IsEmpty()) + if (!tempStr.empty()) { for (i=0; i