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

lasizoillo lasizoillo en gmail.com
Mie Oct 22 15:32:36 CEST 2008


On Wed, Oct 22, 2008 at 1:34 PM, Chema Cortes <pych3m4 en gmail.com> wrote:
> 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?

Segun el API de Java:
http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html
Note: Not all databases allow for a non-typed Null to be sent to the
backend. For maximum portability, the setNull or the setObject(int
parameterIndex, Object x, int sqlType) method should be used instead
of setObject(int parameterIndex, Object x).

Quizá haya otro driver jdbc que no tenga ese problema.

Miranso el codigo del zxJDBC, parece que si pasas el parametro
bindings con una lista de tipos, el sabe llamar a setNull cuando
corresponde. Pero no se muy bien como se establece, la documentación
es bastante fulera.

¿Que ventajas le ves a python-jdbc sobre algo puro en python? ¿Tienes
mucho código en Java a parte de esto? Es solo curiosidad.

Un saludo:

Javi


> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>
_______________________________________________
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