[egenix-users] Problem with cursor.information

Bernhard Snizek bernhard at headnet.dk
Wed Aug 17 14:19:46 CEST 2005


Hi again,

  following your analysis I added one line and now i get a proper  
cursor.description !

if (szColName) {
                 namelen = MIN(cbColNameMax,strlen(sqlcol->name));
                 strncpy(szColName, sqlcol->name, namelen);
                 szColName[namelen]='\0';
                 *pcbColName = namelen;
         }

I will notify the mdbtools project about that ..

Thanx very much for your help I might bother you later towards a  
unixODBCDA for zope3 :)

Cheers

  Bernhard

On 17/08/2005, at 11.40, M.-A. Lemburg wrote:

> M.-A. Lemburg wrote:
>
>> Bernhard Snizek wrote:
>>
>>
>>> Hi,
>>>
>>> I am currently evaluating mxODBC for a medium size database
>>> integration project where I use Z3.
>>>
>>> I want to connect to an Access .mdb file via mdbtools <->  
>>> unixODBC <- >
>>> mxODBC.unixODBC <-> Zope3 [freeBSD]
>>>
>>> Everything works fine, I can establish a connection and even fetch
>>> records BUT cursor.information contains only tuples where the  
>>> column  id
>>> is empty.
>>>
>>>
>>>
>>>>>> import mx
>>>>>> import mx.ODBC
>>>>>> import mx.ODBC.unixODBC
>>>>>> mx.ODBC.unixODBC.DriverConnect('DSN=myDSN')
>>>>>> dc = dn.cursor()
>>>>>> dc.execute('select * from kvarter')
>>>>>> dc.fetchone()
>>>>>>
>>>
>>> (50, 'Br\xf8nsh\xf8j')
>>>
>>>
>>>>>> dc.description
>>>>>>
>>>
>>> (('', 4, None, None, 4, 0, 0), ('', 12, None, None, 100, 0, 1))
>>>
>>> I changed my setup to an iODBC connection, the result is the same,
>>> empty column id's.
>>>
>>> When I open the DSN by using isql and execute the same sql  
>>> statement  as
>>> above it returns the column ids properly:
>>>
>>
>>
>> mxODBC uses SQLDescribeCol() to fetch the column name, isql uses
>> SQLColAttribute(). Both are mapped to a function in the ODBC
>> driver, so it looks as if the mdbtools ODBC doesn't work
>> correctly with SQLDescribeCol() and returns empty strings
>> instead of the true column name.
>>
>
> Here's the snippet from the mdbtools driver:
>
> SQLRETURN SQL_API SQLDescribeCol(
>     SQLHSTMT           hstmt,
>     SQLUSMALLINT       icol,
>     SQLCHAR FAR       *szColName,
>     SQLSMALLINT        cbColNameMax,
>     SQLSMALLINT FAR   *pcbColName,
>     SQLSMALLINT FAR   *pfSqlType,
>     SQLUINTEGER FAR   *pcbColDef, /* precision */
>     SQLSMALLINT FAR   *pibScale,
>     SQLSMALLINT FAR   *pfNullable)
> {
> ...
>     if (szColName) {
>         namelen = MIN(cbColNameMax,strlen(sqlcol->name));
>         strncpy(szColName, sqlcol->name, namelen);
>         szColName[namelen]='\0';
>     }
> ...
>
> and the ODBC specs for the above API:
>
> http://msdn.microsoft.com/library/en-us/odbc/htm/ 
> odbcsqldescribecol.asp
>
> As you can see, the driver forgets to update *pcbColName
> (NameLengthPtr in the ODBC docs - not sure where mdbtools
> got the strange name from) to the value namelen.
>
> Since mxODBC initialized this buffer to 0, it thinks that
> the string length is 0 and thus returns an empty string.
>
> SQLColAttributes() in mdbtools has the same problem, BTW.
>
> -- 
> Marc-Andre Lemburg
> eGenix.com
>
> Professional Python Services directly from the Source  (#1, Aug 17  
> 2005)
>
>>>> Python/Zope Consulting and Support ...        http:// 
>>>> www.egenix.com/
>>>> mxODBC.Zope.Database.Adapter ...             http:// 
>>>> zope.egenix.com/
>>>> mxODBC, mxDateTime, mxTextTools ...        http:// 
>>>> python.egenix.com/
>>>>
> ______________________________________________________________________ 
> __
>
> ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for  
> free ! ::::
>
>



More information about the egenix-users mailing list