//*************************************************************************** void CBCGPDAOGridCtrl::OnItemChanged (CBCGPGridItem* pItem, int nRow, int nColumn) { try { ASSERT_VALID (this); if (m_pRecordSet == NULL) { ASSERT (FALSE); return; } ASSERT_VALID (pItem); ASSERT_VALID (m_pRecordSet); CBCGPGridRow* pRow = pItem->GetParentRow (); if (pRow == NULL) { return; } ASSERT_VALID (pRow); m_pRecordSet->MoveFirst (); m_pRecordSet->Move (nRow); m_pRecordSet->Edit (); COleVariant varCurr; m_pRecordSet->GetFieldValue ((short) nColumn, varCurr); COleVariant varOut; _variant_t varItemData = pItem->GetValue (); if (varItemData.vt == VT_BSTR) { CString str = (LPCTSTR)(_bstr_t) varItemData; BuildURL (pItem, str); varOut = COleVariant (str, VT_BSTRT); } else { varOut = varItemData; } m_pRecordSet->SetFieldValue ((short) nColumn, varOut); m_pRecordSet->Update (); } catch (CDaoException* pEx) { OnDaoException (pEx); pEx->Delete (); OnItemUpdateFailed (); } }
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 (); } }