win32all and ADO

Paul Moore gustav at morpheus.demon.co.uk
Fri Sep 28 15:36:44 EDT 2001


I have a problem using Python with win32all to access a database via ADO.

I'm doing a simple table lookup,

    rs = Dispatch("ADODB.Recordset")
    rs.Open("Table", "Provider=msdaora;...")
    val = rs.Fields(1).Value

[This isn't Oracle related - I tested with an Access database as well]. The
problem is that "val" has a basic Python type - usually a Unicode string. If the
database field type is right (Long Integer in MS Access for instance) I get a
Python 'int' back, but for more general Number types (Decimal in Access, pretty
much anything in Oracle) I get a Unicode string back. OK, I know I can convert
back to some form of numeric form, but it's awfully messy.

In VBScript, you get an error: "Variable uses an Automation type not supported
in VBScript", which is probably worse than Python's answer.

The basic problem, though, is that the Value property is actually a VARIANT
type, and VARIANTs support more data types than either VBScript or Python. For
everyday use, win32all's approach of converting a VARIANT to the "best" native
Python type is reasonable. But for "advanced" use, it would be nice to be able
to get at some form of Python wrapper round a "real" VARIANT, which would allow
the programmer to make the decision.

This issue is even worse in Oracle, where pretty much *all* numeric fields are
stored as something which in ADO/VARIANT terms is a "Decimal" type, and which
Python converts to a Unicode string. Even 3-digit integers :-( So I'm forever
having to convert Unicode strings back to integers.

Time to look into mxODBC or cxOracle...

Paul.



More information about the Python-list mailing list