//
//获得数据库中所有用户表的名称(strCnn:数据库联接字符串;arTables:存放用户表名称的数组;成功返回TRUE,失败返回FALSE)
BOOL GetMDBTables(CString strCnn, CStringArray &arTables)
{
SQLHENV m_henv;
if( SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&m_henv) )
{
TRACE(_T("Failed to run SQLAllocHandle/n"));
return FALSE;
}
// 设置版本信息
if( SQL_SUCCESS != SQLSetEnvAttr(m_henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER) )
{
TRACE(_T("Failed to run SQLSetEnvAttr/n"));
return FALSE;
}
// 分配连接句柄
SQLHDBC m_hdbc;
if( SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC,m_henv,&m_hdbc) )
{
TRACE(_T("Failed to run SQLAllocHandle/n"));
return FALSE;
}
// 连接数据源
UCHAR szConnectOutput[512];
SWORD nResult;
if( SQL_SUCCESS != SQLDriverConnect(m_hdbc,NULL,(UCHAR*)strCnn.GetBuffer(MAX_PATH+1),SQL_NTS,szConnectOutput,sizeof(szConnectOutput),&nResult,SQL_DRIVER_COMPLETE) )
{
TRACE(_T("Failed to run SQLDriverConnect/n"));
return FALSE;
}
strCnn.ReleaseBuffer();
SQLHSTMT hstmt = NULL;
if( SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT,m_hdbc,&hstmt) )
{
TRACE(_T("Failed to run SQLDriverConnect/n"));
return FALSE;
}
// 得到所有表名称和表类型
if( SQL_SUCCESS != SQLTables(hstmt,NULL,0,NULL,0,NULL,0,NULL,0) )
{
TRACE(_T("Failed to run SQLDriverConnect/n"));
return FALSE;
}
SDWORD cb;
char szTableName[256];
char szTableType[256];
CString strName;
SQLBindCol( hstmt, 3, SQL_C_CHAR, szTableName, 255, &cb );
SQLBindCol( hstmt, 4, SQL_C_CHAR, szTableType, 255, &cb );
while( SQL_SUCCESS == SQLFetch(hstmt) )
{
if(strcmp(szTableType,"TABLE")==0)
{
strName=szTableName;
arTables.Add(strName);
}
}
SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
SQLDisconnect( m_hdbc );
SQLFreeHandle( SQL_HANDLE_DBC, m_hdbc );
SQLFreeHandle( SQL_HANDLE_ENV, m_henv );
return TRUE;
}
//
//获得数据库中指定用户表的所有字段名称(strCnn:数据库联接字符串;strTable:用户表名称;arFields;存放用户表名称的数组;成功返回TRUE,失败返回FALSE)
BOOL GetMDBFields(CString strCnn, CString strTable, CStringArray &arFields)
{
SQLHENV m_henv;
if( SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&m_henv) )
{
TRACE(_T("Failed to run SQLAllocHandle/n"));
return FALSE;
}
// 设置版本信息
if( SQL_SUCCESS != SQLSetEnvAttr(m_henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER) )
{
TRACE(_T("Failed to run SQLSetEnvAttr/n"));
return FALSE;
}
// 分配连接句柄
SQLHDBC m_hdbc;
if( SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC,m_henv,&m_hdbc) )
{
TRACE(_T("Failed to run SQLAllocHandle/n"));
return FALSE;
}
// 连接数据源
UCHAR szConnectOutput[512];
SWORD nResult;
if( SQL_SUCCESS != SQLDriverConnect(m_hdbc,NULL,(UCHAR*)strCnn.GetBuffer(MAX_PATH+1),SQL_NTS,szConnectOutput,sizeof(szConnectOutput),&nResult,SQL_DRIVER_COMPLETE) )
{
TRACE(_T("Failed to run SQLDriverConnect/n"));
return FALSE;
}
strCnn.ReleaseBuffer();
SQLHSTMT hstmt = NULL;
if( SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT,m_hdbc,&hstmt) )
{
TRACE(_T("Failed to run SQLDriverConnect/n"));
return FALSE;
}
// 得到所有表名称和字段名称
if( SQL_SUCCESS == SQLColumns(hstmt,NULL,0,NULL,0,NULL,0,NULL,0) )
{
SDWORD cb;
CString str;
char szTableName[256];
char szColumnName[256];
SQLBindCol( hstmt, 3, SQL_C_CHAR, szTableName, 255, &cb );
SQLBindCol( hstmt, 4, SQL_C_CHAR, szColumnName, 255, &cb );
while( SQL_SUCCESS == SQLFetch(hstmt) )
{
if(strcmp(szTableName,(LPCTSTR)strTable)==0)
{
str=szColumnName;
arFields.Add(str);
}
}
}
SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
SQLDisconnect( m_hdbc );
SQLFreeHandle( SQL_HANDLE_DBC, m_hdbc );
SQLFreeHandle( SQL_HANDLE_ENV, m_henv );
return TRUE;
}