VC中用ODBC操作Access数据库

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);
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值