From: | "Inoue, Hiroshi" <inoue(at)tpf(dot)co(dot)jp> |
---|---|
To: | Heikki Linnakangas <hlinnakangas(at)vmware(dot)com> |
Cc: | Christoph Berg <christoph(dot)berg(at)credativ(dot)de>, PostgreSQL ODBC <pgsql-odbc(at)postgresql(dot)org>, psqlodbc(at)packages(dot)debian(dot)org |
Subject: | Re: 09.03.0100 cursor failures on various architectures |
Date: | 2014-02-26 01:19:53 |
Message-ID: | 530D4139.7090707@tpf.co.jp |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-odbc |
(2014/02/26 1:56), Heikki Linnakangas wrote:
> On 02/25/2014 05:13 PM, Hiroshi Inoue wrote:
>>> >1. Most applications are written with the assumption that SQL_C_LONG
>>> >means the native C data type "long". That's clearly what SQL_C_LONG was
>>> >supposed to mean when the ODBC specification was written, and that's
>>> >what Microsoft's sample code does.
>>> >
>>> >2. That's*not* how psqlODBC or unixODBC interprets it. With unixODBC,
>>> >you should use the C data type "SQLINTEGER" with SQL_C_LONG.
>>> >
>>> >3. For maximum portability, an application should avoid using SQL_C_xx.
>>> >Instead, always use SQL_INTEGER or SQL_BIGINT, with an SQLINTEGER or
>>> >SQLBIGINT variable, and cast to native C types.
>>> >
>>> >We should document this somewhere, like in the FAQ..
>> Unfortunately I'm not happy with your summary.
>>
>> My point is simple.
>> Use ODBC data type variables instead of native C data ones when calling
>> ODBC APIs.
>
> Hmm, isn't that the same as my point 3?
>
> I was thinking of something like below for the docs:
>
> ----
> Don't use SQL_C_xxx. They are not part of the SQL/CLI specification, and
> hence not reliably portable across platforms.
Why does using SQL_C_XXXX lose portablity?
Even though SQL/CLI is a standard, ODBC also has been a (defact?)
standard which is older than CLI and widely used.
They are different standard.
We should begin a project e.g. pgsqlcli when we are to stop
using SQL_C_XXXX.
> Instead, use the ODBC
> variable data types, like SQLINTEGER and SQLBIGINT, and the
> corresponding type codes (e.g. SQL_INTEGER and SQL_BIGINT).
>
> For example, the following code is not portable:
>
> long empID;
> ...
> SQLBindCol(stmt, 1, SQL_C_LONG, (SQLPOINTER) &empID,
> sizeof(long), &indicator);
>
> Instead, do this:
>
> SQLINTEGER empID;
> ...
> SQLBindCol(stmt, 1, SQL_INTEGER, (SQLPOINTER) &empID,
> sizeof(SQLINTEGER), &indicator);
Though the code works well, the code is wrong as an ODBC application
in principle.
The code works as expected simply because SQL_INTEGER has the same
value as SQL_C_LONG has fortunately.
> And if necessary, cast to the C type:
>
> long lEmpID = (long) empID;
>
>
> SQL_C_LONG, SQL_C_SLONG and SQL_C_ULONG in particular are known to be a
> problem,
I see no problem except the naming which should have been SQL_C_INTEGER.
regards,
Hiroshi Inoue
--
I am using the free version of SPAMfighter.
SPAMfighter has removed 5330 of my spam emails to date.
Get the free SPAMfighter here: http://www.spamfighter.com/len
Do you have a slow PC? Try a Free scan
http://www.spamfighter.com/SLOW-PCfighter?cid=sigen
From | Date | Subject | |
---|---|---|---|
Next Message | Michael Paquier | 2014-02-26 04:13:49 | Re: pgsql-odbc mailing list size limit |
Previous Message | Ramesh Reddy | 2014-02-25 23:19:08 | Kerberos/GSSAPI Instructions |