BOOL CColumns::Open(UINT nOpenType /* = snapshot */, LPCSTR lpszSQL /* = NULL */, DWORD dwOptions /* = none */) { #ifdef WIN32 ASSERT(lpszSQL == NULL); RETCODE nRetCode; // Cache state info and allocate hstmt SetState(nOpenType,NULL,noDirtyFieldCheck | dwOptions); if (!AllocHstmt()) return FALSE; TRY { OnSetOptions(m_hstmt); AllocStatusArrays(); // call the ODBC catalog function with data member params AFX_SQL_ASYNC(this, ::SQLColumns(m_hstmt, (m_strQualifierParam.IsEmpty()? (UCHAR FAR *)NULL: (UCHAR FAR *)(const char*)m_strQualifierParam), SQL_NTS, (m_strOwnerParam.IsEmpty()? (UCHAR FAR *)NULL: (UCHAR FAR *)(const char*)m_strOwnerParam), SQL_NTS, (m_strTableNameParam.IsEmpty()? (UCHAR FAR *)NULL: (UCHAR FAR *)(const char*)m_strTableNameParam), SQL_NTS, NULL, SQL_NTS)); if (!Check(nRetCode)) ThrowDBException(nRetCode, m_hstmt); // Allocate memory and cache info AllocAndCacheFieldInfo(); AllocRowset(); // Fetch the first row of data MoveNext(); // If EOF, result set is empty, set BOF as well m_bBOF = m_bEOF; } CATCH_ALL(e) { Close(); THROW_LAST(); } END_CATCH_ALL return TRUE; #else // WIN16 RETCODE nRetCode; ASSERT(lpszSQL == NULL); // Allocation and opening of database not supported if (m_hstmt == SQL_NULL_HSTMT) { CString strDefaultConnect; TRY { if (m_pDatabase == NULL) { m_pDatabase = new CDatabase(); m_bRecordsetDb = TRUE; } strDefaultConnect = GetDefaultConnect(); // If not already opened, attempt to open if (!m_pDatabase->IsOpen() && !m_pDatabase->Open("", FALSE, FALSE, strDefaultConnect)) return FALSE; AFX_SQL_SYNC(::SQLAllocStmt(m_pDatabase->m_hdbc, &m_hstmt)); if (!Check(nRetCode)) ThrowDBException(SQL_INVALID_HANDLE); // return FALSE; #JB951122 } CATCH_ALL(e) { #ifdef _DEBUG if (afxTraceFlags & 0x20) TRACE0("Error: CDatabase create for CRecordset failed\n"); #endif // _DEBUG strDefaultConnect.Empty(); if (m_bRecordsetDb) { DELETE_OBJ (m_pDatabase); } ASSERT(m_hstmt == SQL_NULL_HSTMT); THROW_LAST(); } END_CATCH_ALL }
void CBCGPODBCGridCtrl::OnItemChanged (CBCGPGridItem* pItem, int nRow, int nColumn) { ASSERT_VALID (this); if (m_pRecordSet == NULL) { ASSERT (FALSE); return; } try { ASSERT_VALID (pItem); ASSERT_VALID (m_pRecordSet); CBCGPGridRow* pRow = pItem->GetParentRow (); if (pRow == NULL) { return; } ASSERT_VALID (pRow); CString strTable = m_pRecordSet->GetTableName (); RETCODE nRetCode; SQLUSMALLINT RowStatusArray[10]; SQLHSTMT hstmtU; AFX_SQL_SYNC (::SQLAllocStmt (m_pDataBase->m_hdbc, &hstmtU)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } AFX_SQL_SYNC (::SQLSetStmtAttr (hstmtU, SQL_ATTR_CONCURRENCY, (SQLPOINTER)SQL_CONCUR_LOCK, 0)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } AFX_SQL_SYNC (::SQLSetStmtAttr (hstmtU, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN, 0)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } AFX_SQL_SYNC (::SQLSetStmtAttr (hstmtU, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } AFX_SQL_SYNC (::SQLSetStmtAttr (hstmtU, SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, 0)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } _variant_t vtItemValue = pItem->GetValue (); TCHAR szFieldBuffer[5000]; SQLSMALLINT cbBoolVal; tagTIMESTAMP_STRUCT datetime; SQLSMALLINT dataFormatShort; SQLINTEGER dataFormatLong; TCHAR dataFormatChar; SQLUSMALLINT dataFormatUShort; SQLUINTEGER dataFormatULong; SQLREAL dataFormatFloat; SQLDOUBLE dataFormatDouble; #ifdef _WIN64 SQLLEN nFieldLenOrInd; SQLLEN lenColDataTypeInd; #else SQLINTEGER nFieldLenOrInd; SQLINTEGER lenColDataTypeInd; #endif switch (vtItemValue.vt) { case VT_BSTR: { CString strVal = (LPCTSTR) (_bstr_t) pItem->GetValue (); BuildURL (pItem, strVal); AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_CHAR, szFieldBuffer, strVal.GetLength (), &nFieldLenOrInd)); } break; case VT_BOOL: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_BIT, &cbBoolVal, 0, 0)); } break; case VT_DATE: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_TIMESTAMP, &datetime, sizeof (datetime), NULL)); } break; case VT_I2: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_SSHORT, &dataFormatShort, 0, &lenColDataTypeInd )); } break; case VT_I4: case VT_INT: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_SLONG, &dataFormatLong, 0, &lenColDataTypeInd )); } break; case VT_UI1: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_BIT, &dataFormatChar, 0, &lenColDataTypeInd )); } break; case VT_UI2: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_USHORT, &dataFormatUShort, 0, &lenColDataTypeInd )); } break; case VT_UINT: case VT_UI4: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_ULONG, &dataFormatULong, 0, &lenColDataTypeInd )); } break; case VT_R4: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_FLOAT, &dataFormatFloat, 0, &lenColDataTypeInd )); } break; case VT_R8: { AFX_SQL_SYNC (::SQLBindCol (hstmtU, (unsigned short)(nColumn+1), SQL_C_DOUBLE, &dataFormatDouble, 0, &lenColDataTypeInd )); } break; default: return; }; if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } CString strSQL = m_pRecordSet->GetSQL (); #ifdef _UNICODE #if _MSC_VER >= 1300 AFX_SQL_SYNC (::SQLExecDirect (hstmtU, (SQLWCHAR*)(LPCTSTR)strSQL, SQL_NTS)); #else AFX_SQL_SYNC (::SQLExecDirect (hstmtU, (UCHAR*)(LPCTSTR)strSQL, SQL_NTS)); #endif #else AFX_SQL_SYNC (::SQLExecDirect (hstmtU, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS)); #endif if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } AFX_SQL_SYNC (::SQLFetchScroll (hstmtU, SQL_FETCH_ABSOLUTE, nRow+1)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } switch (vtItemValue.vt) { case VT_BSTR: { CString strVal = (LPCTSTR) (_bstr_t) pItem->GetValue (); BuildURL (pItem, strVal); nFieldLenOrInd = strVal.GetLength (); lstrcpy (szFieldBuffer, (LPCTSTR)strVal);; } break; case VT_DATE: { COleDateTime oleDate = (DATE) vtItemValue; datetime.day = (unsigned short)oleDate.GetDay (); datetime.month = (unsigned short)oleDate.GetMonth (); datetime.year = (unsigned short)oleDate.GetYear (); datetime.hour = (unsigned short)oleDate.GetHour (); datetime.minute = (unsigned short)oleDate.GetMinute (); datetime.second = (unsigned short)oleDate.GetSecond (); } break; case VT_BOOL: cbBoolVal = (bool) vtItemValue; break; case VT_I2: dataFormatShort = (short) vtItemValue; break; case VT_I4: case VT_INT: dataFormatLong = (long) vtItemValue; break; case VT_UI1: dataFormatChar = (TCHAR)(BYTE)vtItemValue; break; case VT_UI2: dataFormatUShort = vtItemValue.uiVal; break; case VT_UINT: case VT_UI4: dataFormatULong = vtItemValue.ulVal; break; case VT_R4: dataFormatFloat = (float) vtItemValue; break; case VT_R8: dataFormatDouble = (double) vtItemValue; break; default: return; }; AFX_SQL_SYNC (::SQLSetPos (hstmtU, 1, SQL_UPDATE, SQL_LOCK_NO_CHANGE)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } AFX_SQL_SYNC(::SQLCloseCursor(hstmtU)); if (!m_pDataBase->Check (nRetCode)) { AfxThrowDBException (nRetCode, m_pDataBase, hstmtU); } } catch (CDBException* pEx) { OnODBCException (pEx); pEx->Delete (); OnItemUpdateFailed (); } }