Windows 使用说明

  • 安装odbc驱动程序 解压unvdb_odbc_windows_x64.zip,执行对应的 msi 安装程序

  • 配置数据源 打开 ODBC 数据源管理器

../../_images/odbc.png 点击添加,选择 PostgreSQL 数据源驱动程序,填写数据源信息

../../_images/odbc2.png 点击 Test,验证是否能正常连接

../../_images/odbc3.png

  • 编程示例

    #include <iostream>
    #include <windows.h>
    #include <sql.h>
    #include <sqlext.h>
    
    using namespace std;
    
    int main() {
        SQLHENV env   = SQL_NULL_HENV;
        SQLHDBC dbc   = SQL_NULL_HDBC;
        SQLHSTMT stmt = SQL_NULL_HSTMT;
        SQLRETURN ret;
    
        SQLWCHAR* dsn = (SQLWCHAR*)L"PostgreSQL35W";
        SQLWCHAR* uid = (SQLWCHAR*)L"unvdb";
        SQLWCHAR* pwd = (SQLWCHAR*)L"0202";
        SQLWCHAR* query = (SQLWCHAR*)L"SELECT * FROM tt";
    
        ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
        if (ret != SQL_SUCCESS) {
            cout << "Error allocating environment handle" << endl;
            goto cleanup;
        }
        ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
        if (ret != SQL_SUCCESS) {
            cout << "Error setting environment attribute" << endl;
            goto cleanup;
        }
        ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
        if (ret != SQL_SUCCESS) {
            cout << "Error allocating connection handle" << endl;
            goto cleanup;
        }
        ret = SQLConnect(dbc, dsn, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);
        if (ret != SQL_SUCCESS) {
            cout << "Error connecting to database" << endl;
            goto cleanup;
        }
        ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
        if (ret != SQL_SUCCESS) {
            cout << "Error allocating statement handle" << endl;
            goto cleanup;
        }
        ret = SQLExecDirect(stmt, query, SQL_NTS);
    
        if (ret != SQL_SUCCESS) {
            cout << "Error executing query" << endl;
            goto cleanup;
        }
    
        SQLINTEGER id;
        while (SQLFetch(stmt) == SQL_SUCCESS) {
            ret = SQLGetData(stmt, 1, SQL_C_LONG, &id, 0, NULL);
            if (ret != SQL_SUCCESS) {
                cout << "Error getting data" << endl;
                goto cleanup;
            }
            cout << id << endl;
        }
    
    cleanup:
        if (stmt != SQL_NULL_HSTMT) {
            SQLFreeHandle(SQL_HANDLE_STMT, stmt);
        }
        if (dbc != SQL_NULL_HDBC) {
            SQLDisconnect(dbc);
            SQLFreeHandle(SQL_HANDLE_DBC, dbc);
        }
        if (env != SQL_NULL_HENV) {
            SQLFreeHandle(SQL_HANDLE_ENV, env);
        }
    
        return 0;
    }