⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daocore.cpp

📁 vc6.0完整版
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		InitRelationsCollection();

	// Get DAORelation object and fill in relation info struct
	DAORelation* pDAORelation;
	DAO_CHECK(m_pDAORelations->get_Item(
		COleVariant(lpszName, VT_BSTRT), &pDAORelation));
	FillRelationInfo(pDAORelation, relinfo, dwInfoOptions);

	// Clean up
	pDAORelation->Release();
}

short CDaoDatabase::GetQueryDefCount()
{
	ASSERT_VALID(this);

	short nQueryDefs;

	if (m_pDAOQueryDefs == NULL)
		InitQueryDefsCollection();

	DAO_CHECK(m_pDAOQueryDefs->get_Count(&nQueryDefs));
	return nQueryDefs;
}

void CDaoDatabase::GetQueryDefInfo(int nIndex, CDaoQueryDefInfo& querydefinfo,
	DWORD dwInfoOptions)
{
	ASSERT_VALID(this);

	if (m_pDAOQueryDefs == NULL)
		InitQueryDefsCollection();

	// Get DAOQueryDef object and fill in query info struct
	DAOQueryDef* pDAOQueryDef;
	DAO_CHECK(m_pDAOQueryDefs->get_Item(
		COleVariant((long)nIndex), &pDAOQueryDef));
	FillQueryDefInfo(pDAOQueryDef, querydefinfo, dwInfoOptions);

	// Clean up
	pDAOQueryDef->Release();
}

void CDaoDatabase::GetQueryDefInfo(LPCTSTR lpszName,
	CDaoQueryDefInfo& querydefinfo, DWORD dwInfoOptions)
{
	ASSERT_VALID(this);

	if (m_pDAOQueryDefs == NULL)
		InitQueryDefsCollection();

	// Get DAOQueryDef object and fill in query info struct
	DAOQueryDef* pDAOQueryDef;
	DAO_CHECK(m_pDAOQueryDefs->get_Item(
		COleVariant(lpszName, VT_BSTRT), &pDAOQueryDef));
	FillQueryDefInfo(pDAOQueryDef, querydefinfo, dwInfoOptions);

	// Clean up
	pDAOQueryDef->Release();
}

// Implementation
void CDaoDatabase::InitWorkspace()
{
	ASSERT_VALID(this);

	if (m_pWorkspace == NULL)
	{
		// Allocate workspace and mark as implicit
		m_pWorkspace = new CDaoWorkspace;
		m_pWorkspace->m_nStatus |= AFX_DAO_IMPLICIT_WS;
		m_nStatus |= AFX_DAO_IMPLICIT_WS;
	}

	// Open workspace if not open and not new (unappended)
	if (!m_pWorkspace->IsOpen() && !m_pWorkspace->IsNew())
	{
		// Open the default workspace
		m_pWorkspace->Open();
	}
}

void CDaoDatabase::InitTableDefsCollection()
{
	ASSERT_VALID(this);

	DAO_CHECK(m_pDAODatabase->get_TableDefs(&m_pDAOTableDefs));
}

void CDaoDatabase::FillTableDefInfo(DAOTableDef* pDAOTableDef,
	CDaoTableDefInfo& tabledefinfo, DWORD dwOptions)
{
	ASSERT_VALID(this);
	ASSERT(pDAOTableDef != NULL);
	ASSERT(dwOptions != 0);

	COleVariant var;
	short nBool;

	if (dwOptions & AFX_DAO_FETCH_PRIMARY_PROPERTIES)
	{
		DAO_CHECK(pDAOTableDef->get_Name(&V_BSTR(&var)));
		var.vt = VT_BSTR;
		tabledefinfo.m_strName = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAOTableDef->get_Updatable(&nBool));
		tabledefinfo.m_bUpdatable = nBool == AFX_DAO_TRUE;

		DAO_CHECK(pDAOTableDef->get_Attributes(
			&tabledefinfo.m_lAttributes));
	}

	if (dwOptions & AFX_DAO_FETCH_SECONDARY_PROPERTIES)
	{
		DAO_CHECK(pDAOTableDef->get_DateCreated(&var));
		tabledefinfo.m_dateCreated = var;

		DAO_CHECK(pDAOTableDef->get_LastUpdated(&var));
		tabledefinfo.m_dateLastUpdated = var;

		DAO_CHECK(pDAOTableDef->get_SourceTableName(
			&V_BSTR(&var)));
		var.vt = VT_BSTR;
		tabledefinfo.m_strSrcTableName = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAOTableDef->get_Connect(
			&V_BSTR(&var)));
		var.vt = VT_BSTR;
		tabledefinfo.m_strConnect = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAOTableDef->get_ValidationRule(
			&V_BSTR(&var)));
		var.vt = VT_BSTR;
		tabledefinfo.m_strValidationRule = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAOTableDef->get_ValidationText(
			&V_BSTR(&var)));
		var.vt = VT_BSTR;
		tabledefinfo.m_strValidationText = V_BSTRT(&var);
		var.Clear();
	}

	// This may be expensive, so only get it if absolutely necessary
	if (dwOptions & AFX_DAO_FETCH_ALL_PROPERTIES)
	{
		DAO_CHECK(pDAOTableDef->get_RecordCount(
			&tabledefinfo.m_lRecordCount));
	}
}

void CDaoDatabase::InitRelationsCollection()
{
	ASSERT_VALID(this);

	DAO_CHECK(m_pDAODatabase->get_Relations(&m_pDAORelations));
}

void CDaoDatabase::FillRelationInfo(DAORelation* pDAORelation,
	CDaoRelationInfo& relinfo, DWORD dwOptions)
{
	ASSERT_VALID(this);
	ASSERT(pDAORelation != NULL);
	ASSERT(dwOptions != 0);

	COleVariant var;

	if (dwOptions & AFX_DAO_FETCH_PRIMARY_PROPERTIES)
	{
		// All the relation info is primary
		DAO_CHECK(pDAORelation->get_Name(&V_BSTR(&var)));
		var.vt = VT_BSTR;
		relinfo.m_strName = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAORelation->get_Table(&V_BSTR(&var)));
		var.vt = VT_BSTR;
		relinfo.m_strTable = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAORelation->get_ForeignTable(
			&V_BSTR(&var)));
		var.vt = VT_BSTR;
		relinfo.m_strForeignTable = V_BSTRT(&var);
		var.Clear();
	}

	if (dwOptions & AFX_DAO_FETCH_SECONDARY_PROPERTIES)
	{
		DAOFields* pDAOFields = NULL;
		DAOField* pDAOField = NULL;

		DAO_CHECK(pDAORelation->get_Attributes(
			&relinfo.m_lAttributes));

		// Get the fields collection
		DAO_CHECK(pDAORelation->get_Fields(&pDAOFields));

		TRY
		{
			// Get the number of fields in the relation
			short nCount;
			DAO_CHECK(pDAOFields->get_Count(&nCount));

			// Allocate or reallocate memory for array if necessary
			if (nCount != relinfo.m_nFields)
			{
				if (relinfo.m_nFields != 0)
				{
					// Check that allocation is correct.
					ASSERT(relinfo.m_nFields == 0 ||
						relinfo.m_bCleanupFieldInfo);

					delete[] relinfo.m_pFieldInfos;
					relinfo.m_pFieldInfos = NULL;
				}

				// Now allocate required memory
				relinfo.m_pFieldInfos = new CDaoRelationFieldInfo[nCount];
				relinfo.m_bCleanupFieldInfo = TRUE;
				relinfo.m_nFields = nCount;
			}

			// Now get field info for each field
			for (int nIndex = 0; nIndex < relinfo.m_nFields; nIndex++)
			{
				// Get the field item
				DAO_CHECK(pDAOFields->get_Item(
					COleVariant((long)nIndex), &pDAOField));

				// Get the field name
				DAO_CHECK(pDAOField->get_Name(&V_BSTR(&var)));
				var.vt = VT_BSTR;
				relinfo.m_pFieldInfos[nIndex].m_strName =
					V_BSTRT(&var);
				var.Clear();

				// Get the foreign field name
				DAO_CHECK(pDAOField->get_ForeignName(&V_BSTR(&var)));
				var.vt = VT_BSTR;
				relinfo.m_pFieldInfos[nIndex].m_strForeignName =
					V_BSTRT(&var);
				var.Clear();

				// Release and reset the field object
				pDAOField->Release();
				pDAOField = NULL;
			}
		}
		CATCH_ALL(e)
		{
			if (pDAOField != NULL)
				pDAOField->Release();

			pDAOFields->Release();
			THROW_LAST();
		}
		END_CATCH_ALL

		// Release the objects
		pDAOFields->Release();
	}
}

void CDaoDatabase::InitQueryDefsCollection()
{
	ASSERT_VALID(this);

	DAO_CHECK(m_pDAODatabase->get_QueryDefs(&m_pDAOQueryDefs));
}

void CDaoDatabase::FillQueryDefInfo(DAOQueryDef* pDAOQueryDef,
	CDaoQueryDefInfo& querydefinfo, DWORD dwOptions)
{
	ASSERT_VALID(this);
	ASSERT(pDAOQueryDef != NULL);
	ASSERT(dwOptions != 0);

	COleVariant var;
	short nBool;

	if (dwOptions & AFX_DAO_FETCH_PRIMARY_PROPERTIES)
	{
		DAO_CHECK(pDAOQueryDef->get_Name(&V_BSTR(&var)));
		var.vt = VT_BSTR;
		querydefinfo.m_strName = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAOQueryDef->get_Type(&querydefinfo.m_nType));
	}

	if (dwOptions & AFX_DAO_FETCH_SECONDARY_PROPERTIES)
	{
		DAO_CHECK(pDAOQueryDef->get_Updatable(&nBool));
		querydefinfo.m_bUpdatable = nBool == AFX_DAO_TRUE;

		DAO_CHECK(pDAOQueryDef->get_DateCreated(&var));
		querydefinfo.m_dateCreated = var;

		DAO_CHECK(pDAOQueryDef->get_LastUpdated(&var));
		querydefinfo.m_dateLastUpdated = var;

		DAO_CHECK(pDAOQueryDef->get_ReturnsRecords(&nBool));
		querydefinfo.m_bReturnsRecords = nBool == AFX_DAO_TRUE;
	}

	if (dwOptions & AFX_DAO_FETCH_ALL_PROPERTIES)
	{
		DAO_CHECK(pDAOQueryDef->get_SQL(&V_BSTR(&var)));
		var.vt = VT_BSTR;
		querydefinfo.m_strSQL = V_BSTRT(&var);
		var.Clear();

		DAO_CHECK(pDAOQueryDef->get_Connect(&V_BSTR(
			(LPVARIANT)var)));
		var.vt = VT_BSTR;
		querydefinfo.m_strConnect = V_BSTRT(&var);
		var.Clear();

		// DAO will display ODBC connect dialog
		// if data source no longer exists. This must
		// be avoided during bulk info retrieval.
		// Call CDaoQueryDef::GetODBCTimeout directly.
		//  DAO_CHECK(pDAOQueryDef->get_ODBCTimeout(
		//      &querydefinfo.m_nODBCTimeout));

		// Set the m_nODBCTimeout variable to invalid value.
		querydefinfo.m_nODBCTimeout = -1;
	}
}

void CDaoDatabase::ThrowDaoException(int nAfxDaoError)
{
	ASSERT_VALID(this);

	AfxThrowDaoException(nAfxDaoError);
}

#ifdef _DEBUG
void CDaoDatabase::AssertValid() const
{
	CObject::AssertValid();
}

void CDaoDatabase::Dump(CDumpContext& dc) const
{
	ASSERT_VALID(this);

	CObject::Dump(dc);

	dc << "m_bOpen = " << m_bOpen;
	dc << "\nm_nStatus = " << m_nStatus;

	dc << "\n";
}
#endif //_DEBUG

//////////////////////////////////////////////////////////////////////////
// CDaoTableDef
IMPLEMENT_DYNAMIC(CDaoTableDef, CObject)

CDaoTableDef::CDaoTableDef(CDaoDatabase* pDatabase)
{
	m_bOpen = FALSE;
	m_bNew = FALSE;

	m_pDatabase = pDatabase;
	m_pDAOTableDef = NULL;
	m_pDAOFields = NULL;
	m_pDAOIndexes = NULL;
}

CDaoTableDef::~CDaoTableDef()
{
	if (IsOpen())
		Close();
	else if (m_bNew)
	{
		// Remove the tabledef from the CDaoDatabase's map
		m_pDatabase->m_mapTableDefs.RemoveKey(this);
	}
}

void CDaoTableDef::Create(LPCTSTR lpszName, long lAttributes,
	LPCTSTR lpszSrcTable, LPCTSTR lpszConnect)
{
	ASSERT_VALID(this);
	ASSERT(!IsOpen());

	DAO_CHECK(m_pDatabase->m_pDAODatabase->CreateTableDef(
		COleVariant(lpszName, VT_BSTRT), COleVariant(lAttributes),
		COleVariant(lpszSrcTable, VT_BSTRT),
		COleVariant(lpszConnect, VT_BSTRT), &m_pDAOTableDef));

	m_bNew = TRUE;

	// Add the tabledef to map of Open/New CDaoTableDefs
	m_pDatabase->m_mapTableDefs.SetAt(this, this);
}

void CDaoTableDef::Append()
{
	ASSERT_VALID(this);
	ASSERT(m_bNew);
	ASSERT(m_pDAOTableDef != NULL);

	DAOTableDefs* pDAOTableDefs;
	DAO_CHECK(m_pDatabase->m_pDAODatabase->get_TableDefs(
		&pDAOTableDefs));

	TRY
	{
		DAO_CHECK(pDAOTableDefs->Append(m_pDAOTableDef));
	}
	CATCH_ALL(e)
	{
		pDAOTableDefs->Release();
		THROW_LAST();
	}
	END_CATCH_ALL

	pDAOTableDefs->Release();

	m_bNew = FALSE;
	m_bOpen = TRUE;
}

void CDaoTableDef::Open(LPCTSTR lpszName)
{
	ASSERT_VALID(this);
	ASSERT(lpszName != NULL);

	// Re-open is invalid
	if (IsOpen())
	{
		ASSERT(FALSE);
		return;
	}

	DAOTableDefs* pDAOTableDefs = NULL;

	TRY
	{
		DAO_CHECK(m_pDatabase->m_pDAODatabase->get_TableDefs(
			&pDAOTableDefs));
		DAO_CHECK(pDAOTableDefs->get_Item(
			COleVariant(lpszName, VT_BSTRT),&m_pDAOTableDef));
	}
	CATCH_ALL(e)
	{
		if (pDAOTableDefs != NULL)
			pDAOTableDefs->Release();
		THROW_LAST();
	}
	END_CATCH_ALL

	pDAOTableDefs->Release();

	m_bOpen = TRUE;

	// Add the tabledef to map of Open/New CDaoTableDefs
	m_pDatabase->m_mapTableDefs.SetAt(this, this);
}

void CDaoTableDef::Close()
{
	ASSERT_VALID(this);

	if (m_pDAOIndexes != NULL)
	{
		m_pDAOIndexes->Release();
		m_pDAOIndexes = NULL;
	}

	if (m_pDAOFields != NULL)
	{
		m_pDAOFields->Release();
		m_pDAOFields = NULL;
	}

	if (m_pDAOTableDef != NULL)
	{
		m_pDAOTableDef->Release();
		m_pDAOTableDef = NULL;
	}

	m_bOpen = FALSE;
	m_bNew = FALSE;

	// Remove the tabledef from the CDaoDatabase's map
	m_pDatabase->m_mapTableDefs.RemoveKey(this);
}

BOOL CDaoTableDef::CanUpdate()
{
	ASSERT_VALID(this);
	ASSERT(IsOpen());
	ASSERT(m_pDAOTableDef != NULL);

	short nUpdatable;
	DAO_CHECK(m_pDAOTableDef->get_Updatable(&nUpdatable));
	return nUpdatable == AFX_DAO_TRUE;
}

void CDaoTableDef::SetName(LPCTSTR lpszName)
{
	ASSERT_VALID(this);
	ASSERT(IsOpen() || m_bNew);
	ASSERT(m_pDAOTableDef != NULL);

	COleVariant var(lpszName, VT_BSTRT);
	DAO_CHECK(m_pDAOTableDef->put_Name(V_BSTR(&var)));
}

CString CDaoTableDef::GetName()
{
	ASSERT_VALID(this);
	ASSERT(IsOpen());
	ASSERT(m_pDAOTableDef != NULL);

	COleVariant var;
	DAO_CHECK(m_pDAOTableDef->get_Name(&V_BSTR(&var)));
	var.vt = VT_BSTR;
	return V_BSTRT(&var);
}

void CDaoTableDef::SetSourceTableName(LPCTSTR lpszSrcTableName)
{
	ASSERT_VALID(this);
	ASSERT(IsOpen() || m_bNew);
	ASSERT(m_pDAOTableDef != NULL);

	COleVariant var(lpszSrcTableName, VT_BSTRT);
	DAO_CHECK(m_pDAOTableDef->put_SourceTableName(
		V_BSTR(&var)));
}

CString CDaoTableDef::GetSourceTableName()
{
	ASSERT_VALID(this);
	ASSERT(IsOpen());
	ASSERT(m_pDAOTableDef != NULL);

	COleVariant var;
	DAO_CHECK(m_pDAOTableDef->get_SourceTableName(
		&V_BSTR(&var)));
	var.vt = VT_BSTR;
	return V_BSTRT(&var);
}

void CDaoTableDef::SetConnect(LPCTSTR lpszConnect)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -