View Single Post

   
  #2 (permalink)  
Old 04-16-2008, 01:28 AM
Marten Feldtmann
 
Posts: n/a
Default Re: Windows, ODBC drivers and strange points ...

Dave Page schrieb:

>>
>>
>>a) All column names are returned from the database
>> in lowercase and not in the form the client send
>> then when doing the "create table ..." statement.
>>
>> Which leads to the problem, that other frameworks
>> on top of it do not find their columns do make the
>> oo-rdbms mapping stuff.
>>
>>

>
>No, table names are returns in the correct case:
>
> Successfully connected to DSN 'foo'.
>SQLTables:
>In: StatementHandle = 0x003B18D8, CatalogName = SQL_NULL_HANDLE,
>NameLength1 = 0, SchemaName = SQL_NULL_HANDLE, NameLength2 = 0,
> TableName = SQL_NULL_HANDLE, NameLength3 = 0, TableType =
>SQL_NULL_HANDLE, NameLength4 = 0
>Return: SQL_SUCCESS=0
>
>Get Data All:
>"TABLE_QUALIFIER", "TABLE_OWNER", "TABLE_NAME", "TABLE_TYPE", "REMARKS"
><Null>, "public", "MiXeD_CaSe_TaBlE", "TABLE", ""
><Null>, "public", "UPPER_CASE_TABLE", "TABLE", ""
><Null>, "public", "lower_case_table", "TABLE", ""
>3 rows fetched from 5 columns.
>
>Are you sure you quoted the names when you created them? If not, the
>server will have folded them to lower case.
>
>
>

This means, that under PostgreSQL one should in general quote
the column names when creating them ? Do I also have to quote
them in the SELECT statements ???

>>b) All strings returned by the ODBC driver are defined
>> in a buffer, which is offered to the ODBC subsystem
>> as a string doubled in size - though I told the
>> databaase NOT to create a UNICODE db.
>>
>> An example: a column has the result type char(15). The
>> ODBC drivers put the result of this column into a
>> memory with a size of 30 characters.
>>
>> The ODBC subsystem now thinks: fine - I've a character
>> column with size 30 and creates a string 30 characters
>> long and one gets 15 corrects characters and 15 "0" (null)
>> bytes.
>>
>>

>
>With 3 bytes of data, (ie. The word 'foo') I get:
>
>SQLGetData:
>In: Statementhandle = 0x003B18D8, ColumnNumber = 1,
>TargetType = SQL_C_CHAR=1, TargetValuePtr = 0x000952D0, BufferLength =
>600,
> StrLen_or_IndPtr = 0x00093E58
>Return: SQL_SUCCESS=0
>Out: *TargetValuePtr = "foo", *StrLen_or_IndPtr = 3
>
>When I request an SQL_C_CHAR, or if I request a SQL_C_WCHAR:
>
>SQLGetData:
>In: Statementhandle = 0x003B18D8, ColumnNumber = 1,
>TargetType = SQL_C_WCHAR=-8, TargetValuePtr = 0x00097FF8, BufferLength =
>600,
> StrLen_or_IndPtr = 0x0009F2F8
>Return: SQL_SUCCESS=0
>Out: *TargetValuePtr = "foo", *StrLen_or_IndPtr = 6
>
>Regards, Dave.
>

Ok, this is true - but this is not my problem. How do I get to know, that
the source type is either SQL_C_CHAR or SQL_C_WCHAR - this is the problem.

I thought this would be possible with the COlumnDesc function - but this
seems not to be the case.

By the way: what happens if you have UNICODE values in the buffer and
you want the target type SQL_C_CHAR ??? Is this allowed ? What code page
is then used ? The system code page or the application code page ?

Marten



---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply With Quote