void CDataControl::GetFieldNameCn(const CString& sTableName,CADORecordset* pAdoAccess,const CString& sNameEn, CString& sNameCn)
{
SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 4;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
ix = 0;
SafeArrayPutElement(psa, &ix, &var);
ix= 1;
SafeArrayPutElement(psa, &ix, &var);
ix = 2;
var.vt = VT_BSTR;
var.bstrVal =sTableName.AllocSysString(); //表名 sTableName
SafeArrayPutElement(psa, &ix, &var);
var.vt = VT_BSTR;
ix = 3;
var.bstrVal =sNameEn.AllocSysString();//字段名
SafeArrayPutElement(psa, &ix, &var);
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;
pAdoAccess->m_pRecordset = pAdoAccess->GetActiveConnection()->OpenSchema(adSchemaColumns,&Array);
Field *fd = pAdoAccess->m_pRecordset->Fields->GetItem("DESCRIPTION");
if (fd->GetValue().vt != VT_NULL)
{
_bstr_t column_discription = fd->Value;
CString sNote;
sNote.Format(_T("%s"), (LPCTSTR)column_discription);
sNameCn = (LPCTSTR)column_discription;
}
else
{
sNameCn = sNameEn;
}
}
BOOL CDataControl::GetFileNULL(const CString& sTableName,const CString& sFileNameEN,CString& sFileNameCN,CADORecordset* pAdoAccess,BOOL& ISNullSet, int& OrdinalPostion)
{
SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 4;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
ix = 0;
SafeArrayPutElement(psa, &ix, &var);
ix= 1;
SafeArrayPutElement(psa, &ix, &var);
ix = 2;
var.vt = VT_BSTR;
var.bstrVal =sTableName.AllocSysString(); //表名 sTableName
SafeArrayPutElement(psa, &ix, &var);
var.vt = VT_BSTR;
ix = 3;
var.bstrVal =sFileNameEN.AllocSysString();//字段名
SafeArrayPutElement(psa, &ix, &var);
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;
pAdoAccess->m_pRecordset = pAdoAccess->GetActiveConnection()->OpenSchema(adSchemaColumns,&Array);
//IS_NULL = 1 表示字段可以为空 0 表示必填
ISNullSet = (pAdoAccess->m_pRecordset->Fields->GetItem("IS_NULLABLE")->Value.boolVal == -1)?TRUE:FALSE;//是否允许为空
_bstr_t column_name = pAdoAccess->m_pRecordset->Fields->GetItem("COLUMN_NAME")->Value;//字段名
OrdinalPostion = pAdoAccess->m_pRecordset->Fields->GetItem("ORDINAL_POSITION")->Value;//字段序号
Field *fd = pAdoAccess->m_pRecordset->Fields->GetItem("DESCRIPTION");
if (fd->GetValue().vt != VT_NULL)
{
_bstr_t column_discription = fd->Value;
CString sNote;
sNote.Format(_T("%s"), (LPCTSTR)column_discription);
sFileNameCN = (LPCTSTR)column_discription;
}
else
{
sFileNameCN = sFileNameEN;
}
//int NUMERIC_PRECISION = m_pRecordset->Fields->GetItem("NUMERIC_PRECISION")->Value;
//int NUMERIC_SCALE = m_pRecordset->Fields->GetItem("NUMERIC_SCALE")->Value;
return TRUE;
}
BOOL CDataControl::GetFilePkName(const CString& sTableName,std::vector<CString>& sPkName,CADORecordset* pAdoAccess)
{
SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 3;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
ix = 0;
SafeArrayPutElement(psa, &ix, &var);
ix= 1;
SafeArrayPutElement(psa, &ix, &var);
ix = 2;
var.vt = VT_BSTR;
var.bstrVal =sTableName.AllocSysString(); //表名 sTableName
SafeArrayPutElement(psa, &ix, &var);
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;
pAdoAccess->m_pRecordset = pAdoAccess->GetActiveConnection()-> OpenSchema(adSchemaPrimaryKeys,&Array); //adSchemaColumns
while(!pAdoAccess->IsEOF())
{
_bstr_t column_name = pAdoAccess->m_pRecordset->Fields->GetItem("COLUMN_NAME")->Value;
_bstr_t column_PK= pAdoAccess->m_pRecordset-> Fields-> GetItem( "PK_NAME")-> Value;
sPkName.push_back((LPCTSTR)column_name);
pAdoAccess->MoveNext();
}
return TRUE;
}
C++ access数据库中字段信息获取
C++ 树层级存储
用了一个map来记录所有的层级关系,然后从root找起,依次找出所有的节点…
// 用的是tinyXML读取
BOOL CXmlRead::ReadGroupInfo( std::map<CString, std::vector<std::pair<CString, BOOL>>> &mapGroup )
{
// 载入文件
TiXmlDocument *doc = new TiXmlDocument(PATH);
if (!doc->LoadFile())
{
delete doc;
return FALSE;
}
// 获取根节点
TiXmlElement *pRoot = doc->FirstChildElement(_T("TableGroup"));
ASSERT(pRoot);
if (pRoot == NULL)
{
delete doc;
return FALSE;
}
mapGroup.clear();
std::vector<std::pair<CString, BOOL>> vecTable;
TiXmlElement *pNode = dynamic_cast<TiXmlElement *>(pRoot->FirstChildElement());
while (pNode != NULL)
{
// 节点属性
CString strSubName = pNode->Attribute(_T("Name"));
vecTable.push_back(std::make_pair(strSubName, TRUE));
ASSERT(_T("Group") == (CString)(pNode->Value()));
if(!ReadNode(pNode, mapGroup))
{
return FALSE;
}
// 下一关键字节点
pNode = dynamic_cast<TiXmlElement *>(pNode->NextSiblingElement());
}
mapGroup[_T("ROOT")] = vecTable;
delete doc;
return TRUE;
}
BOOL CXmlRead::ReadNode(TiXmlElement *pNode, std::map<CString, std::vector<std::pair<CString, BOOL>>> &mapGroup)
{
// 每次添加的新节点应该是之前没有出现过的,否则会死循环
CString strNodeName = pNode->Attribute(_T("Name"));
if(mapGroup.end() != mapGroup.find(strNodeName)) return FALSE;
std::vector<std::pair<CString, BOOL>> vecTable;
TiXmlElement *pSubNode = dynamic_cast<TiXmlElement *>(pNode->FirstChildElement());
while (pSubNode != NULL)
{
// 节点名
CString strSub = pSubNode->Value();
// 节点属性
CString strSubName = pSubNode->Attribute(_T("Name"));
if(_T("Group") == strSub)
{
vecTable.push_back(std::make_pair(strSubName, TRUE));
if(!ReadNode(pSubNode, mapGroup))
{
return FALSE;
}
}
else if(_T("Table") == strSub)
{
vecTable.push_back(std::make_pair(strSubName, FALSE));
}
// 下一关键字节点
pSubNode = dynamic_cast<TiXmlElement *>(pSubNode->NextSiblingElement());
}
mapGroup[strNodeName] = vecTable;
return TRUE;
}
其实vector里面的bool是可以不要的,最初加这个只是为了区分树节点和叶节点…
C++ 获取某目录下的全部文件
特别需要注意的是,每个文件夹下有.和..两个文件夹分别代表当前目录和上级目录(根目录的..代表当前目录)…IsDot就是用来检测当前是不是.或..的函数