2011-01-21 8 views
5

Parece que no soy el único con este problema, pero no parece haber un problema de este tipo.Campos de Bool anulables en las tablas vinculadas de MS Access

Estoy trabajando en Access 2010, utilizando una tabla vinculada a una base de datos de SQL Server 2005 (a través de un conducto ODBC de SQL Server). En esa tabla, uno de los campos booleanos está marcado como anulable, y varios registros en esta tabla de hecho tienen un nulo en el campo. Hasta aquí todo bien.

En viene Acceso, y tan pronto como abra la tabla vinculada, Access muestra un 0 (falso) en lugar de una celda en blanco (problema # 1). Y si intenta modificar algo en el registro, recibirá un mensaje de error que dice que el registro fue modificado por otra persona y sus cambios no pueden guardarse. Este último problema se debe al hecho de que Access no tolera los campos de bool nullable, y se vuelve un poco loco cuando intenta guardar el valor.

Mi investigación muestra que esto podría tener algo que ver con Access utilizando Jet en segundo plano para conectarse a la base de datos de SQL Server, y Jet aparentemente no admite boles nulables. No parece haber una forma de configurar Jet para que lo admita (aunque tal vez sí, si se está conectando en el código). También pensé que MS estaba reemplazando a Jet con otra tecnología utilizada en Office 2010 (ACE, creo), pero no puedo decir si esto es realmente lo que usa Access. En cualquier caso, no puedo encontrar opciones configurables con respecto a los booleantes nulables.

Por último, este problema parece haber sido criado con la EM hace un corto tiempo, pero no hay una respuesta en su final: https://connect.microsoft.com/SQLServer/feedback/details/617339/null-bit-fields-produce-spurious-ms-access-errors-when-using-the-native-odbc-driver?wa=wsignin1.0#tabs

Me pregunto si alguien más por ahí se ha topado con esto y encontrado una solución. Y antes de sugerirlo, quitar la opción que no admite nulos y establecer todos los nulos en 'falso' no es realmente una opción en nuestro caso. Para nosotros, null es en realidad un estado válido y muy diferente de 'falso'.

Thx!

+2

Este es un problema conocido desde Access 97: http://support.microsoft.com/kb/278696/EN-US. Como nada ha cambiado en los últimos 14 años, no esperaría ninguna solución pronto ... – Heinzi

Respuesta

5

ACE es una actualización de Jet (bifurcada desde la base de código de Jet 4.0, mantenida por el equipo de Windows y sin ver ningún desarrollo posterior, mientras que ACE está en pleno desarrollo por parte del equipo de Access). No es significativamente diferente de Jet, excepto en que es una nueva versión del motor de base de datos y tiene características que carecían de Jet.

Booleanos anulables no son una de las características adicionales. En cualquier caso, si no me equivoco, hay grandes argumentos teóricos sobre si Booleans debe ser Nullable y Jet/ACE se reduce en el lado que dice que no deberían ser.

Booleanos no anulables causan problemas incluso dentro de Access/Jet/ACE (Allen Browne has discussed one such, with LEFT JOINs). Mi sugerencia es que cambie el campo a un campo de Nullable Bit, Byte o Integer (no estoy seguro de qué tipos de datos exactos están en SQL Server, ni cuál será más compatible con Access/Jet/ACE).

Alternativamente, puede abordarlo de la misma manera que se trata el problema BIGINT utilizando una vista para CAST() la booleana del lado del servidor para una INT. Eso lo hace no editable pero (al igual que con BIGINT), puede mantener el campo original en la VISTA y escribirlo con los valores apropiados, mientras que la versión CAST() es sólo para visualización.

Por lo que vale, el SSMA para Access convierte Booleanos Jet/ACE en campos de bits con nulos (aunque no estoy seguro de por qué son Nullable, ¡podría necesitar revisar algunas de mis aplicaciones para asegurarme de que funcionan correctamente!)

+0

Bit Nullable está bien, creo. –

+1

Hola, lo siento por la respuesta tardía. Revisé nuestra base de datos SQL, y ya es un bit que admite valores NULL. No hay otro tipo de campo que permita que se almacenen datos de tipo booleano en él, a menos que busque un int nullable y ponga una restricción de 0/1 en él. Es una opción, pero tiene repercusiones en otros lugares. No es mi primera opción. –

+0

Re el comentario sobre SSMA upsizing bools a bits anulables - ¿podría explicar eso un poco? ¿Se refiere a una tabla de acceso con campos de bool que se interpreta como un bit que admite valores nulos cuando se conecta a la tabla thios? Voy en una dirección diferente: mi tabla está en SQL Server, y estoy usando Access para conectarme a ella ... –

0

Siguiendo el análisis en este Microsoft KB http://support.microsoft.com/kb/318882 esto es lo que hicimos para resolver este problema.1) Ejecutamos un script sql para actualizar las filas en esa tabla que tenía nulos en los campos de bit, 2) Luego modificamos la definición de tabla para incluir un valor predeterminado de '0' en esos campos de bit.

+0

Ese es un artículo interesante. No he tenido tales problemas con la última base de datos que actualicé (ejecutando A2003 con SQL Server Express 2008 R2) y no proporcioné un valor predeterminado para los campos booleanos. Tendré que hacer un control, pero si el problema citado hubiera ocurrido, habría estado recibiendo informes de errores importantes durante los últimos 6 meses (que no he tenido), por lo que parece que debe haber algo más. . Quizás algo cambió entre SQL 2005 y 2008. Me pregunto si todas las tablas tienen un PK y un campo de marca de tiempo. –

Cuestiones relacionadas