Ejemplo n.º 1
0
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
	}
Ejemplo n.º 2
0
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 ();
	}
}