[jython] insertar nulls en Access con jdbc (workaround)

Chema Cortes pych3m4 en gmail.com
Mie Oct 22 13:34:02 CEST 2008


Tengo un problema al insertar datos SQL NULL en base de datos MsAccess
(con jython y bridge jdbc:odbc).

from com.ziclix.python.sql import zxJDBC as db

rutaMDB="C:/mydb.mdb"
URL="jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s"%rutaMDB
driver="sun.jdbc.odbc.JdbcOdbcDriver"
con=db.connect(URL,"","",driver)
...

Si ejecuto el insert directamente funciona bien:

cur.execute("INSERT INTO tabla (campo1) values (NULL)")

En cambio, si lo hago parametrizando da problemas:

cur.execute("INSERT INTO tabla (campo1) values (?)",(None,))

Error: error setting index [1] [SQLCode: 0]
[Microsoft][Controlador ODBC Microsoft Access]Tipo de datos SQL no
válido [SQLCode: 67], [SQLState: S1004]


No he encontrado información sobre este fallo y cómo solucionarlo.
Como necesitaba volcar datos desde SGDBs a ficheros MDBs, al final me
he hecho un "workaround" que parece apañar el problema:


def cursor_armoured(conn,coltypes):
    from com.ziclix.python.sql import DataHandler

    class PyHandler(DataHandler):
        def __init__(self, handler, coltypes):
            self.handler=handler
            self.coltypes=coltypes
        def setJDBCObject(self, stmt, index, obj):
            md=stmt.getMetaData()
            if obj is None:
                stmt.setNull(index, self.coltypes[index-1])
            else:
                self.handler.setJDBCObject(stmt, index, obj)

    cur=conn.cursor()
    cur.datahandler=PyHandler(cur.datahandler,coltypes)
    return cur

cur=cursor_armoured(con,(db.NULL,))
cur.execute("INSERT INTO tabla (campo1) values (?)",(None,))


He buscado por el código fuente de jython (zxJDBC) y no he encontrado
dónde parchearlo. ¿Alguna idea?
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es