16,472
社区成员
发帖
与我相关
我的任务
分享
bool CDBInfoDlg::ListTables(bool bViews, bool bSystemTables)
{
CDatabase database;
CString type = " 'TABLE ' ";
int ret= -1;
HSTMT hStmt;
UCHAR szName[256];
SDWORD cbName;
CString names;
if( bViews )
type += ", 'VIEW ' ";//视图
if( bSystemTables )
type += ", 'SYSTEM TABLE ' ";//系统表
try{
if( !database.Open(m_strDSN) )
return false;
}
catch(...){
AfxMessageBox( "Unable To Obtain Table Information ");
return false;
}
SQLAllocStmt(database.m_hdbc,&hStmt);
ret = SQLTables(hStmt,
NULL,SQL_NTS,
NULL,SQL_NTS,
NULL,SQL_NTS,
(unsigned char *)type.GetBuffer(0),SQL_NTS);
if(ret == SQL_ERROR){
SQLFreeStmt(hStmt,SQL_CLOSE);
database.Close();
if(ret == SQL_INVALID_HANDLE ){
AfxMessageBox( "Invalid handle ");
return false;
}
AfxMessageBox( "Database Could Not be Open ");
return false;
}
m_cmbTables.ResetContent();
while(1){
ret = SQLFetch(hStmt);
if(ret == SQL_NO_DATA_FOUND)
break;
ret = SQLGetData(hStmt, 3, SQL_C_CHAR, szName, TABLE_NAME_LENGTH, &cbName);
names.Format( "%s ",szName);
m_cmbTables.AddString(names);
}
m_cmbTables.SetCurSel(0);
SQLFreeStmt(hStmt,SQL_CLOSE);
database.Close();
ShowTable();
return true;
}
void CdbToolsDlg::GetDatabaseSchema(_ConnectionPtr pConnection, _bstr_t* bstrTableNames, int* nTableCount, _bstr_t bstrFilter)
{
ASSERT(pConnection-> State==adStateOpen);
_RecordsetPtr pRstSchema = NULL;
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;
SafeArrayPutElement(psa, &ix, &var);
var.vt = VT_BSTR;
//表的类型有 "ALIAS " "TABLE " "SYNONYM " "SYSTEM TABLE "
"VIEW " "GLOBAL TEMPORARY " "LOCAL TEMPORARY " "SYSTEM VIEW "
var.bstrVal = bstrFilter;//这里bstrFilter= "TABLE "就可以了
ix = 3;
SafeArrayPutElement(psa, &ix, &var);
var.vt=VT_EMPTY;
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;
try
{
pRstSchema = pConnection-> OpenSchema(adSchemaTables,&Array);
*nTableCount=0;
while(!(pRstSchema-> EndOfFile))
{
if(bstrTableNames!=NULL)
{
_bstr_t table_name = pRstSchema-> Fields->
GetItem( "TABLE_NAME ")-> Value;
*(bstrTableNames++)=table_name;
}
*nTableCount+=1;
pRstSchema-> MoveNext();
}
}
catch (_com_error e) {
PrintComError(e);
}
if(pRstSchema)
if (pRstSchema-> State == adStateOpen)
pRstSchema-> Close();
}