adodbapi problemas con campos MEMO y BLOB

Amm-Python python en ammsoft.com
Dom Nov 11 20:16:55 CET 2007


Plataforma: 
Windows XP
Python 2.4.2
adodbapi 2.1
Pywin32-210

Problema:
Tengo que traspasar cierta información a una base de datos MS Access
2000. La información debe enviarse a un campo MEMO y a un campo Blob,
que en Access es un campo tipo IMAGE (oleobject). En el campo blob se
debe almacenar un fichero tipo ZIP.

El problema radica en que los datos que se almacenan no siempre son
correctos. Intentaré explicarme; en el campo MEMO sólo me guarda los
primeros 510 caracteres del campo a guardar. En el campo IMAGE falta, a
veces, el último carácter. Concretamente si el tamaño es impar !!!!!
(supongo que los campos IMAGE de access siempre son pares....).

No se si estoy haciendo algo mal, por lo que os adjunto una muestra del
código por si sabéis la solución. 

El código, un ejemplo simple, intenta guardar el mismo valor, que va
incrementado su longitud, en un campo MEMO y en un campo IMAGE, leyendo
los datos guardados para revisar si se han registrado correctamente,
mostrando las longitudes de los campos origen y destino.

NOTA: El proceso debo hacerlo con adodbapi u otro módulo GPL, es decir;
mxodbc no me sirve.

Saludos,
Toni

# -*- coding: iso-8859-15 -*-
dbname = "ejemplo.mdb" #nombre de la base de datos

#imports
import win32com.client
import pywintypes
import adodbapi

#creación de la base de datos
adoConn = win32com.client.Dispatch(r'ADOX.Catalog')
DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=%s;' % dbname
adoConn.Create(DSN) #crea la base de datos
adoConn = win32com.client.Dispatch('ADODB.Connection')
adoConn.Open(DSN) #abre la base de datos

#crea la tabla de ejemplo
sql = """create table EJEMPLO (id text(32), observaciones LONGCHAR,
objeto IMAGE, Constraint id Primary Key (id))""" 

(adoRS, success) = adoConn.Execute(sql)
adoConn.Close()

#abre la conexión con adodbapi
myDBs = adodbapi.connect(DSN)
myCursor = myDBs.cursor()

#genera 999 registros
sql = """insert into ejemplo (id, observaciones, objeto) values(?, ?,
?)"""

for x in range(1, 1000):
    texto = "a" * x #texto a guardar se va incrementando su longitud
    valores = ["%04d" % x, texto, adodbapi.Binary(texto)]
    
    myCursor.execute(sql,valores) #inserta registro
    myDBs.commit()

    #selecciona el registro insertado    
    buscar = "select observaciones, objeto from ejemplo where id=?"
    valor = ["%04d" % x]
    myCursor.execute(buscar,valor)
    res = myCursor.fetchone()

    #mirar si el campo MEMO es correcto
    if res[0] != texto:
        status = "Memo mal "
    else:
        status = "Memo ok "

    ob = res[1]

    #mirar si el campo IMAGE es correcto    
    if str(ob) != texto:
        status += "Blob mal :" + str(res[1]) + ":" + texto
    else:
        status += "Blob ok "

    #imprime el resiltado    
    print valores[0], len(texto), len(res[0]), len(res[1]), status
    
myDBs.close()

_______________________________________________
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