[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