The sqldata field
To hold the column data, the client application must allocate a buffer and set sqldata to point to this buffer. If your client application might perform code-set conversion, it must allocate sufficient storage to handle the increase in the size of the column data that might occur.
When the DESCRIBE ... INTO statement sets the sqllen field, the sqllen value indicates the length of the column data in the database code set. Therefore, if you use the value of sqllen that the DESCRIBE ... INTO statement retrieves, you might not allocate a buffer that is sufficiently large for the data values when they are in the client code set.
For example, the following code
fragment allocates an sqldata buffer with the malloc(
) system call:
EXEC SQL include sqlda;
...
struct sqlda *q_desc;
...
EXEC SQL describe sqlstmt_id into q_desc;
...
q_desc->sqlvar[0].sqldata =
(char *)malloc(q_desc->sqlvar[0].sqllen);
In
the preceding code fragment, the client application might truncate
characters that it converts because the client application uses the sqllen value
to determine the buffer size. Instead, increase the buffer to four
times its original size when you allocate a buffer, as the following
code fragment shows:
EXEC SQL include sqlda;
EXEC SQL define BUFSIZE_FACT 4;
...
struct sqlda *q_desc;
...
q_desc->sqlvar[0].sqllen =
q_desc->sqlvar[0].sqllen * BUFSIZE_FACT + 1;
q_desc->sqlvar[0].sqldata =
(char *)malloc(q_desc->sqlvar[0].sqllen);
A
buffer-size factor (BUFSIZE_FACT) of 4
is suggested
because a multibyte character has a maximum size of 4 bytes.