VC中用ODBC操作Access数据库

来源:互联网 发布:凤凰金融 人工智能网 编辑:程序博客网 时间:2024/05/01 13:53
const char szConnect[] = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
const char szDBName[] = "StudData.mdb";

void ODBCConnect(HWND);
void ODBCDisconnect(HWND);
void ODBCQuery(char *);
void ODBCQueryEnd(void);
void FetchResult(void);

void ODBCConnect(HWND hDlg)
{
    try {
        SQLRETURN sr;

        sr = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
        if (sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) throw sr;
        sr = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
        if (sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) {
            SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
            throw sr;
        }
        sr = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConn);
        if (sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) {
            SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
            throw sr;
        }
        strcpy(szConnectString, szConnect);
        strcat(szConnectString, szDBName);
        sr = SQLDriverConnect(hConn, hDlg, (unsigned char *)szConnectString, sizeof(szConnectString), (unsigned char *)ConnBuf, sizeof(ConnBuf), (short *)&StrLen, SQL_DRIVER_COMPLETE);
        if (sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) {
            SQLFreeHandle(SQL_HANDLE_DBC, hConn);
            SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
            throw sr;
        }
    }
    catch (SQLRETURN) {
        MessageBox(hDlg, "Database connection failed!", "Sorry", MB_OK | MB_ICONWARNING);
        ExitProcess(0);
    }
}

void ODBCDisconnect(HWND hDlg)
{
    SQLDisconnect(hConn);
    SQLFreeHandle(SQL_HANDLE_DBC, hConn);
    SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}

void ODBCQuery(char *query)
{
    try {
        SQLRETURN sr;

        sr = SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hStmt);
        if (sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) throw sr;
        sr = SQLExecDirect(hStmt, (unsigned char *)query, strlen(query));
        if (sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) {
            SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
            throw sr;
        }
    }
    catch (SQLRETURN) {
        char errorbuf[128];
        SQLError(hEnv, hConn, hStmt, NULL, NULL, (unsigned char *)errorbuf, sizeof(errorbuf), (short *)&StrLen);
        MessageBox(NULL, "Database query failed!", "Sorry", MB_OK | MB_ICONWARNING);
        MessageBox(NULL, errorbuf, "Sorry", MB_OK | MB_ICONWARNING);
    }
}

void ODBCQueryEnd(void)
{
    SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
}

void FetchResult(void)
{
    SQLRETURN sr;
    LV_ITEM lvi;
    int i, row;

    for (i = 0; i < 10; ++i) SQLBindCol(hStmt, i + 1, SQL_C_CHAR, buf[i], sizeof(buf[i]), (long *)&StrLen);

    for (row = 0; ; ++row) {
        sr = SQLFetch(hStmt);
        if (sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) break;
        lvi.mask = LVIF_TEXT | LVIF_PARAM;
        lvi.iItem = row;
        lvi.iSubItem = 0;
        lvi.pszText = buf[0];
        SendMessage(hList, LVM_INSERTITEM, 0, (long)&lvi);
        lvi.mask = LVIF_TEXT;
        for (i = 1; i < 10; ++i) {
            lvi.iSubItem = i;
            lvi.pszText = buf[i];
            SendMessage(hList, LVM_SETITEM, 0, (long)&lvi);
        }
    }
}
原创粉丝点击