//#include <afxdb.h>
void CDataDlg::OnButton2() 
...{
// TODO: Add your control notification handler code here
CStringArray strList;
ListTables(FALSE, FALSE, strList );
for( int i=0; i< strList.GetSize(); i++)
...{
m_list1.AddString( strList.GetAt( i ) );
}
strList.RemoveAll();
}
//VC编程列举数据库中的表格
BOOL ListTables(bool bViews, bool bSystemTables, CStringArray & listbox)
...{
// const char strDSN[]="ds_person";//???¨??μ?ODBCêy?Y?′??3?
// CDatabase database;
CDatabase m_database;
int ret= -1;
HSTMT hStmt;
UCHAR szName[256];
SDWORD cbName;
// è±ê?è?ó??§±í?¢2?êy????êóí??¢?μí3±í
CString type = "'TABLE'";
if( bViews )
type += ", 'VIEW'";//êóí?
if( bSystemTables )
type += ", 'SYSTEM TABLE'";//?μí3±í
// í¨1yODBC′ò?aêy?Y?a
try
...{
if( !m_database.Open(NULL,FALSE,FALSE,_T("ODBC;"),TRUE) )
return false;
}
catch(CDBException * e)
...{
AfxMessageBox(e->m_strError);
return false;
}
// ·???Statement??±ú
//SQLAllocStmt (database.m_hdbc,&hStmt);
SQLAllocHandle (SQL_HANDLE_STMT,m_database.m_hdbc,&hStmt);
// ??è?±íD??¢(·μ??ò???êy?Y±í)
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);
m_database.Close();
if(ret == SQL_INVALID_HANDLE )
...{
AfxMessageBox("Invalid handle");
return false;
}
AfxMessageBox("Database Could Not be Open");
return false;
}
// áD±í???t????
// listbox.ResetContent();
CString strtemp;
while(1)
...{
strtemp = "";
// è?êy?Yμ??o3???
ret = SQLFetch(hStmt);
if(ret == SQL_NO_DATA_FOUND)
break;
// è??3ò?áDêy?Y(μú3áD?a±í??£??????1óD±íê?D??¢êy?Y?a??μè)
// ret = SQLGetData(hStmt, 3, SQL_C_CHAR, szName, TABLE_NAME_LENGTH, &cbName);
ret = SQLGetData(hStmt, 3, SQL_C_CHAR, szName, 10, &cbName);
strtemp = ((char*)szName);//?óè?áD±í???t??ê?
listbox.Add(strtemp);
}
// listbox.SetCurSel(0);//???D
// êí·???±ú
SQLFreeStmt( hStmt,SQL_CLOSE);
m_database.Close();
return true;
}
本文介绍如何使用VC++编程语言通过MFC类库来枚举指定数据库中的所有表和视图。代码示例展示了如何打开数据库连接,并利用SQL标准的SQLTables过程来获取表名,最终将这些表名显示在界面上。
4154

被折叠的 条评论
为什么被折叠?



