Parameter | Description |
---|---|
iCol | Column to get data from |
iLen | Length of data to get |
Returns data from a column.
Function SQLGetDataToUChar Integer iCol Integer iLen Returns UChar[]
Call: | Get SQLGetDataToUChar iCol iLen to UCharArrayVariable |
SQLGetDataToUchar can be used to retrieve character data to a UChar array. This may be needed if the data is retrieved in chunks and multi-byte Unicode characters get split in 2 parts over 2 chunks.
When retrieving character data with SQLGetDataToUchar, data is returned in a UChar array as a wide string (wstring) (2 bytes per character).
Example for retrieving binary data with SQLGetDataToUchar:
Procedure DemoSQLGetDataToUCharBinary Handle hoConnect hoStmt Integer iFetchResult iNumCols iCol iResult iNextSetResult iColumnType iChunkSize String sValue UChar[] uaTotalBinary uaChunk Get SQLConnect of oSQLHandler "MSSQLDRV" "DFCONNID=MSSQLOrderEntryId" to hoConnect If (hoConnect > 0) Begin Get SQLOpen of hoConnect to hoStmt If (hoStmt <> 0) Begin Send SQLExecDirect of hoStmt "Select ID, varbinarymax10 from TestBinaryTable Order By ID" Repeat Get SQLStmtAttribute of hoStmt SQLSTMTATTRIB_COLUMNCOUNT to iNumCols If (iNumCols > 0) Begin Repeat Get SQLFetch of hoStmt to iFetchResult If (iFetchResult <> 0) Begin For iCol from 1 to iNumCols Get SQLColumnType of hoStmt iCol to iColumnType If ( (iColumnType = SQL_BINARY) or (iColumnType = SQL_VARBINARY) or (iColumnType = SQL_LONGVARBINARY) ) Begin Repeat Move 100 to iChunkSize Get SQLGetDataToUChar of hoStmt iCol iChunkSize to uaChunk If (SQLResult = 1) Begin Showln (sFormat("iCol=%1,Binary chunk: length = %2",iCol,(SizeOfArray(uaChunk)))) Move (AppendArray(uaTotalBinary,uaChunk)) to uaTotalBinary End Until (SQLResult <> 1) End Loop End Until (iFetchResult = 0) End Get SQLNextResultSet of hoStmt to iNextSetResult Until (iNextSetResult = 0) Send SQLClose of hoStmt End Send SQLDisconnect of hoConnect End End_Procedure
This sample retrieves character data using SQLGetDataToUchar. The example retrieves the data of a Unicode varchar column (nvarchar(max) on SQL Server) in chunks of 10. If the data contains non-bmp characters (4 byte characters in UTF16, for example smiley characters), this can be split across chunks. The first 2 bytes of the character can be in one chunk, the last 2 bytes in the next chunk.
Procedure DemoSQLGetDataToUCharVarchar Handle hoConnect hoStmt Integer iFetchResult iNumCols iCol iResult iNextSetResult iColumnType iChunkSize String sValue UChar[] uaTotalVarchar uaChunk Get SQLConnect of oSQLHandler "MSSQLDRV" "DFCONNID=MSSQLOrderEntryId" to hoConnect If (hoConnect > 0) Begin Get SQLOpen of hoConnect to hoStmt If (hoStmt <> 0) Begin Send SQLExecDirect of hoStmt "Select ID, NVarcharMaxColumn from TestSQLGetDataTable Order By ID" Repeat Get SQLStmtAttribute of hoStmt SQLSTMTATTRIB_COLUMNCOUNT to iNumCols If (iNumCols > 0) Begin Repeat Get SQLFetch of hoStmt to iFetchResult If (iFetchResult <> 0) Begin For iCol from 1 to iNumCols Get SQLColumnType of hoStmt iCol to iColumnType If ( (iColumnType = SQL_WVARCHAR) or (iColumnType = SQL_WLONGVARCHAR) ) Begin Move (ResizeArray(uaTotalVarchar,0)) to uaTotalVarchar Repeat Move 10 to iChunkSize Get SQLGetDataToUChar of hoStmt iCol iChunkSize to uaChunk If (SQLResult = 1) Begin Showln (sFormat("iCol=%1,Binary chunk: length = %2",iCol,(SizeOfArray(uaChunk)))) Move (AppendArray(uaTotalVarchar,uaChunk)) to uaTotalVarchar End Until (SQLResult <> 1) // uaTotalVarchar will contain varchar data stored as wstring // Convert back to regular string Pointer pWideBuf String sString Integer iTotalLen Move (SizeOfArray(uaTotalVarchar)) to iTotalLen // Add a WString zero terminor (2 bytes) Move (iTotalLen + 2) to iTotalLen Move (ResizeArray(uaTotalVarchar,iTotalLen)) to uaTotalVarchar Move (AddressOf(uaTotalVarchar[0])) to pWideBuf Move (PointerToWString(pWideBuf)) to sString Showln (SFormat(" sString = [%1]",sString)) End Loop End Until (iFetchResult = 0) End Get SQLNextResultSet of hoStmt to iNextSetResult Until (iNextSetResult = 0) Send SQLClose of hoStmt End Send SQLDisconnect of hoConnect End End_Procedure