Some examples for enabling LOB locator support.
// Assumes that DSN has been named "sampledsn" and // UseLobLocator has been set to 1. SQLHENV environmentHandle = SQL_NULL_HANDLE; SQLHDBC connectionHande = SQL_NULL_HANDLE; SQLHSTMT statementHandle = SQL_NULL_HANDLE; SQLRETURN ret; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &environmentHandle); SQLSetEnvAttr(environmentHandle, SQL_ATTR_ODBC_VERSION, SQL_ATTR_OV_ODBC3); SQLAllocHandle(SQL_HANDLE_DBC, environmentHandle, &connectionHandle); Ret = SQLConnect(connectionHandle, "sampledsn", SQL_NTS, "sa", SQL_NTS, "Sybase",SQL_NTS);
// Selects and retrieves a locator for bk_desc, where // bk_desc is a column of type text defined in a table // named books. bk_desc contains the text "A book". SQLPrepare(statementHandle, "SELECT bk_desc FROM books WHERE bk_id =1", SQL_NTS); SQLExecute(statementHandle); BYTE TextLocator[SQL_LOCATOR_SIZE]; SQLLEN Len = 0; ret = SQLGetData(statementHandle, SQL_C_TEXT_LOCATOR, TextLocator, sizeof(TextLocator),&Len); If(Len == sizeof(TextLocator)) { Cout << Locator was created with expected size << Len; }
SQLLEN LocatorLen = sizeof(TextLocator); ret = SQLBindParameter(statementHandle, 1, SQL_PARAM_INPUT, SQL_C_TEXT_LOCATOR, SQL_TEXT_LOCATOR, SQL_LOCATOR_SIZE, 0, TextLocator, sizeof(TextLocator), &LocatorLen); SQLLEN CharLenSize = 0; SQLINTEGER CharLen = 0; ret = SQLBindParameter(statementHandle, 2, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER,0 , 0, &CharLen, sizeof(CharLen), &CharLenSize); SQLExecDirect(statementHandle, "{CALL sp_drv_text_locator_charlength( ?,?) }" , SQL_NTS); cout<< "Character Length of Data " << charLen;
SQLINTEGER retVal = 0; SQLLEN Col1Len = sizeof(retVal); SQLCHAR appendText[10]=”abcdefghi on C++”; SQLBindParameter(statementHandle, 14, SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &retVal, 0, Col1Len); SQLBindParameter(statementHandle, 21, SQL_PARAM_INPUT, SQL_C_TEXT_LOCATOR, SQL_TEXT_LOCATOR, SQL_LOCATOR_SIZE, 0, &TextLocator, sizeof(TextLocator), SQL_NULL_HANDLE); SQLBindParameter(statementHandle, 32, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &charLen, 0, SQL_NULL_HANDLE); SQLBindParameter(statementHandle, 43, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 10, 0, append_text, sizeof(append_text), SQL_NULL_HANDLE); SQLExecDirect(statementHandle, "{? = CALL sp_drv_setdata_text (?, ?, ?,?) }" , SQL_NTS); SQLFreeStmt(statementHandle, SQL_CLOSE);
SQLCHAR description[512]; SQLLEN descriptionLength = 512; SQLBindParameter(statementHandle, 1, SQL_PARAM_INPUT, SQL_C_TEXT_LOCATOR, SQL_TEXT_LOCATOR, SQL_LOCATOR_SIZE, 0, TextLocator, sizeof(TextLocator), SQL_NULL_HANDLE); SQLExecDirect(statementHandle, "{CALL sp_drv_locator_to_text(?)}", SQL_NTS); SQLFetch(statementHandle); SQLGetData(statementHandle, 1,SQL_C_CHAR, description, descriptionLength, &descriptionLength) Cout << "LOB data referenced by locator:" << description << endl; Cout << "Expected LOB data:A book on C++" << endl;
description = "A lot of data that will be used for a lot of inserts, updates and deletes"; descriptionLength = SQL_NTS; SQLBindParameter(statementHandle, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 512, 0, description, sizeof(description), &descriptionLength); SQLExecDirect(statementHandle, "{CALL sp_drv_create_text_locator(?)}", SQL_NTS); SQLFetch(statementHandle); SQLGetData(statementHandle, SQL_C_TEXT_LOCATOR, TextLocator, sizeof(TextLocator),&Len);