Skip to content

BLOB大对象插入及查询示例代码

c
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);
    if (ret != SQL_SUCCESS)
    {
        SQLCHAR sqlState[128];
        SQLINTEGER nativeErr;
        SQLCHAR errMsg[256];
        SQLSMALLINT len;
        SQLGetDiagRec(SQL_HANDLE_DBC, hdbc, 1, sqlState, &nativeErr, errMsg, 200, &len);
        printf("Can't connect to server, reason: %s\n", errMsg);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    printf("Connect successful!\n");
    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    FILE* fp = fopen("ODBC.png", "rb");

    int cbRead = 0;
    char data[4096];
    SQLPOINTER pToken = NULL;

    int id = 1;
    SQLLEN cbIdLen = 4;
    SQLLEN cbLen = SQL_LEN_DATA_AT_EXEC(0);
    char sql[] = "insert into mytable(id, img) values(?,?)";
    ret = SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS);
    ret = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 4, &cbIdLen);
    ret = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 123456789, 0, (SQLPOINTER)2, 0, &cbLen);
    ret = SQLExecute(hstmt);
    while (ret == SQL_NEED_DATA)
    {
        ret = SQLParamData(hstmt, &pToken);
        if (ret == SQL_NEED_DATA && (int)pToken == 2)
        {
            do {
                cbRead = fread(data, 1, 4096, fp);
                if (cbRead <= 0)break;
                SQLPutData(hstmt, data, cbRead);
            } while (1);
        }
    }
    fclose(fp);
    ret = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    fp = fopen("Output.png", "wb");
    strcpy(sql, "select img from mytable where id = 1");
    ret = SQLExecDirect(hstmt, (SQLCHAR*)sql, SQL_NTS);
    ret = SQLFetch(hstmt);
    SQLLEN retlen;
    while (TRUE)
    {
        ret = SQLGetData(hstmt, 1, SQL_C_CHAR, data, 4096, &retlen);
        if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
            break;
        fwrite(data, 1, retlen, fp);
    }
    fclose(fp);
    ret = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    ret = SQLDisconnect(hdbc);
    ret = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    ret = SQLFreeHandle(SQL_HANDLE_ENV, henv);
}