做了个ODBC API方式访问Access数据库的小窗口,读出来了一堆表,实际上我只做了一个表“课程”,其他的英文表有没有专家知道是干啥的
CListBox* plistbox = (CListBox*)GetDlgItem(IDC_LIST1);
SQLSMALLINT col=0;
SQLHENV henv;
SQLHDBC hdbc;
RETCODE rc;
SQLHSTMT hstmt;
SQLCHAR szTableName[128], szTableType[128];
SQLLEN cbTableName, cbTableType;
LPCTSTR tmptable;
tmptable = (char*)malloc(100);
char username[10];
char password[10];
char sourcename[30];
strcpy_s(sourcename, _countof(sourcename), "test");//strcpy(sourcename, "test");
strcpy_s(username, _countof(username), "");//strcpy(username, "");
strcpy_s(password, _countof(password), "");//strcpy(password, "");
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_UINTEGER); //该行没有后续会报错
rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
rc = SQLConnect(hdbc, (SQLCHAR*)sourcename, SQL_NTS, (SQLCHAR*)username, SQL_NTS, (SQLCHAR*)password, SQL_NTS);
if (rc == SQL_INVALID_HANDLE)
MessageBoxA(NULL, "fail to query the table!", MB_ICONSTOP | MB_TASKMODAL);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, (HSTMT FAR*) & hstmt);
rc = SQLTables(hstmt, NULL, 0, NULL, 0, NULL, 0, NULL, 0);
SQLNumResultCols(hstmt, &col);
if (rc == SQL_INVALID_HANDLE)
MessageBoxA(NULL, "fail to query the table!",MB_ICONSTOP | MB_TASKMODAL);
if (rc == SQL_SUCCESS)
{
SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, sizeof(szTableName), & cbTableName);
SQLBindCol(hstmt, 4, SQL_C_CHAR, szTableType, sizeof(szTableType), & cbTableType);
}
while (true)
{
rc = SQLFetch(hstmt);
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
tmptable = (LPCTSTR)szTableName;
plistbox->InsertString(-1, tmptable);
这是系统表,存储的是“元数据”,也就是表结构的定义。
【以下回答由 GPT 生成】
while (SQLFetch(hstmt) == SQL_SUCCESS) {
SQLGetData(hstmt, 3, SQL_C_CHAR, szTableName, sizeof(szTableName), &cbTableName); // 获取表名
SQLGetData(hstmt, 4, SQL_C_CHAR, szTableType, sizeof(szTableType), &cbTableType); // 获取表类型
// 这里可以将获取到的表名和表类型进行处理或记录
// 例如,可以将它们添加到CListBox中进行展示
CString strTableName(szTableName);
CString strTableType(szTableType);
plistbox->AddString(strTableName + " (" + strTableType + ")");
}
是的,如果您想要了解这些附加的表格的意义,您可以获取到这些表格的表名和表类型。表名可以用于标识不同的表格,例如,可以通过表名推测表格的作用。表类型可以告诉您这些表格是系统表、用户表还是其他类型的表。通过这些信息,您可以更好地了解这些附加的表格。
您没有提供您使用的编译器和操作系统的信息,但是根据代码中的一些细节(例如,使用malloc
分配内存),假设您在Windows平台上使用Visual C++编译器。
对于您提供的代码,有一些可以进行优化或修改的地方:
在使用malloc
分配内存之后,应该使用free
释放这段内存,以免造成内存泄漏。可以在使用完tmptable
变量后添加以下代码进行内存释放:
free(tmptable);
SQLConnect
函数调用之后添加以下代码进行检查:if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
// 连接失败的处理逻辑
}
检查SQLAllocHandle
和SQLTables
的返回值,可以在这些函数调用之后添加代码来处理错误情况。
如果您还有其他问题或需要进一步的帮助,请提供更多的信息,以便我能够更好地回答您的问题。
【相关推荐】