Skip to content

SQLColumns列信息查询示例代码

c
typedef struct {
    char tableCat[50];
    SQLLEN tableCatLen;
    char tableSchem[50];
    SQLLEN tableSchemLen;
    char tableName[50];
    SQLLEN tableNameLen;
    char columnName[50];
    SQLLEN columnNameLen;
    short dataType;
    SQLLEN dataTypeLen;
    char typeName[50];
    SQLLEN typeNameLen;
    int columnSize;
    SQLLEN columnSizeLen;
    int bufferLength;
    SQLLEN bufferLengthLen;
    short decimalDigits;
    SQLLEN decimalDigitsLen;
    short numPrecRadix;
    SQLLEN numPrecRadixLen;
    short nullable;
    SQLLEN nullableLen;
    char comments[50];
    SQLLEN commentsLen;
    char columnDef[50];
    SQLLEN columnDefLen;
    short sqlDataType;
    SQLLEN sqlDataTypeLen;
    short sqlDatetimeSub;
    SQLLEN sqlDatetimeSubLen;
    int charOctetLength;
    SQLLEN charOctetLengthLen;
    int ordinalPosition;
    SQLLEN ordinalPositionLen;
    char isNullable[50];
    SQLLEN isNullableLen;
}ColInfo;

void main()
{
    char szDSN[] = "XuguDB";
    char szUID[] = "SYSDBA";
    char szAuth[] = "SYSDBA";
    SQLHENV henv = NULL;
    SQLHDBC hdbc = NULL;
    SQLHSTMT hstmt = NULL;
    SQLRETURN ret = 0;
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    ret = SQLConnect(hdbc, (SQLCHAR*)szDSN, SQL_NTS, (SQLCHAR*)szUID, SQL_NTS, (SQLCHAR*)szAuth, SQL_NTS);
    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    ret = SQLColumns(hstmt,
        (SQLCHAR*)"SYSTEM", SQL_NTS,
        (SQLCHAR*)"SYSDBA", SQL_NTS,
        (SQLCHAR*)"MYTABLE", SQL_NTS,
        (SQLCHAR*)"%", SQL_NTS);

    ColInfo info;
    SQLBindCol(hstmt, 1, SQL_C_CHAR, info.tableCat, 50, &info.tableCatLen);
    SQLBindCol(hstmt, 2, SQL_C_CHAR, info.tableSchem, 50, &info.tableSchemLen);
    SQLBindCol(hstmt, 3, SQL_C_CHAR, info.tableName, 50, &info.tableNameLen);
    SQLBindCol(hstmt, 4, SQL_C_CHAR, info.columnName, 50, &info.columnNameLen);
    SQLBindCol(hstmt, 5, SQL_C_SHORT, &info.dataType, 2, &info.dataTypeLen);
    SQLBindCol(hstmt, 6, SQL_C_CHAR, info.typeName, 50, &info.typeNameLen);
    SQLBindCol(hstmt, 7, SQL_C_LONG, &info.columnSize, 4, &info.columnSizeLen);
    SQLBindCol(hstmt, 8, SQL_C_LONG, &info.bufferLength, 4, &info.bufferLengthLen);
    SQLBindCol(hstmt, 9, SQL_C_SHORT, &info.decimalDigits, 2, &info.decimalDigitsLen);
    SQLBindCol(hstmt, 10, SQL_C_SHORT, &info.numPrecRadix, 2, &info.numPrecRadixLen);
    SQLBindCol(hstmt, 11, SQL_C_SHORT, &info.nullable, 2, &info.nullableLen);
    SQLBindCol(hstmt, 12, SQL_C_CHAR, info.comments, 50, &info.commentsLen);
    SQLBindCol(hstmt, 13, SQL_C_CHAR, info.columnDef, 50, &info.columnDefLen);
    SQLBindCol(hstmt, 14, SQL_C_SHORT, &info.sqlDataType, 2, &info.sqlDataTypeLen);
    SQLBindCol(hstmt, 15, SQL_C_SHORT, &info.sqlDatetimeSub, 2, &info.sqlDatetimeSubLen);
    SQLBindCol(hstmt, 16, SQL_C_LONG, &info.charOctetLength, 4, &info.charOctetLengthLen);
    SQLBindCol(hstmt, 17, SQL_C_LONG, &info.ordinalPosition, 4, &info.ordinalPositionLen);
    SQLBindCol(hstmt, 18, SQL_C_CHAR, info.isNullable, 50, &info.isNullableLen);

    while (TRUE)
    {
        ret = SQLFetch(hstmt);
        if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
            break;
        printf("ColName: %s, Comments: %s\n",
            info.columnName, info.comments);
    }
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
}