Access是關係型數據庫,根據關係型數據庫理論,同一個數據庫中一般不存在相同結構的基本表,因爲沒有必要,完全可以union起來。但是,在實際編程開發過程中,總會存在一些奇特的需求;比如我現在做的這個項目,一個井眼對應一個基本表,而這些基本表的結構卻完全相同,又不能合併。既然沒有必要存在相同結構的基本表,當讓就不存在複製基本表(或基本表的結構)的函數了,因而只能自己用代碼來完成;大致思路是這樣,先創建一個新的表定義,然後獲取已存在的的基本表的字段信息和索引信息,然後利用這些信息設置新表定義的對應信息,看代碼: m_pDataSet->Open(); CDaoTableDef *pTableDef=new CDaoTableDef(m_pDataSet->m_pDatabase); pTableDef->Create(str);
CDaoFieldInfo newfield; int j=m_pDataSet->GetFieldCount(); for(int i=0;i<j;i++) { m_pDataSet->GetFieldInfo(i,newfield,AFX_DAO_SECONDARY_INFO); pTableDef->CreateField(newfield); } CDaoIndexInfo newindex; j=m_pDataSet->GetIndexCount(); for(int i=0;i<j;i++) { m_pDataSet->GetIndexInfo(2,newindex,AFX_DAO_SECONDARY_INFO); pTableDef->CreateIndex(newindex); } pTableDef->Append(); m_pDataSet->Close(); m_pDataSet->Open(pTableDef); .........
剩下的工作就簡單了,對新表進行數據插入操作。
兩個結構體的定義如下: struct CDaoFieldInfo //字段信息結構 { CStringm_strName; // Primary shortm_nType; // Primary longm_lSize; // Primary longm_lAttributes; // Primary shortm_nOrdinalPosition; // Secondary BOOLm_bRequired; // Secondary BOOLm_bAllowZeroLength; // Secondary longm_lCollatingOrder; // Secondary CStringm_strForeignName; // Secondary CStringm_strSourceField; // Secondary CStringm_strSourceTable; // Secondary CStringm_strValidationRule; // All CStringm_strValidationText; // All CStringm_strDefaultValue; // All };
struct CDaoIndexInfo //索引信息結構 { CDaoIndexInfo( ); // Constructor CStringm_strName; // Primary CDaoIndexFieldInfo*m_pFieldInfos; // Primary shortm_nFields; // Primary BOOLm_bPrimary; // Secondary BOOLm_bUnique; // Secondary BOOLm_bClustered; // Secondary BOOLm_bIgnoreNulls; // Secondary BOOLm_bRequired; // Secondary BOOLm_bForeign; // Secondary longm_lDistinctCount; // All // Below the // Implementation comment: // Destructor, not otherwise documented };
其實我沒有認真看着兩個結構的定義,沒必要嘛! 還要對GetFieldInfo和GetIndexInfo兩個函數的第三個參數說明一下: //AFX_DAO_PRIMARY_INFO (默認值)函數將獲得包括字段名、字段類型、字段尺寸及字段屬性等基本信息 //AFX_DAO_SECONDARY_INFO 不僅包括上面的信息,還包括字段序號、可控性、是否允許空字符串、排序規則、別名、源字段名以及源表名等輔助信息 //AFX_DAO_ALL_INFO 不僅包括基本信息和輔助信息,還包括合法性規則以及合法性文版在內的全部信息 當然,包含的信息越多,函數執行的速度越低,應當根據實際需求來取捨!