📄 daocore.cpp
字号:
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 + -