MS Access
Introducción
Hoy en día, muy poca gente optará por usar este tipo de bases de datos, ya que los problemas que genera son superiores a los beneficios que se obtienen. A lo largo de los años, las expectativas puestas en MS Access han ido decayendo de forma alarmante, hasta llegar a ser un producto casi residual y ampliamente rechazado por la comunidad de programadores.
Sin embargo, el atractivo de MS Access reside en la integración de un interfaz de usuario que permite el desarrollo de pequeñas aplicaciones totalmente funcionales de una forma rápida y sencilla. Este tipo de soluciones tienen un coste y complejidad muy inferior a soluciones basadas en la instalación de motores de bases de datos, diseño de la base de datos y desarrollo de aplicaciones con interfaces de usuario amigables que se conectan a dichas bases de datos.
Haciendo un poco de historia (Microsoft Access - Wikipedia y Access Database Engine - Wikipedia), desde el motor Jet 3.0 de Access 7.0 (Office 95) hasta el motor Jet 4.0 de Access 2003 hubo relativos avances que hacían pensar en una buena evolución del entorno. Sin embargo, con la aparición del nuevo motor ACE para Access 2007 las expectativas desaparecieron de la noche a la mañana. De nuevo, con la versión de 2010, se hizo patente el oscuro futuro de este tipo de aplicaciones: el imponente lío que suponían los nuevos drivers de 32 y 64 bits, que no venían ya con el sistema operativo, hicieron imposible la entrega de soluciones sin instalables. Ni que decir tiene que estos nuevos drivers ni si quiera solucionaban los problemas de los anteriores, sino que introducían otros nuevos. Para colmo, a partir de la versión 1703 (actualización a Office 2016) se introdujo un nuevo tipo de datos (Número Grande: Usar el tipo de datos Número grande (microsoft.com)) no soportado por los drivers. En la última versión de Office (2021) se ha vuelto a introducir otro tipo de datos nuevo: Date/Time Extended (Usar el tipo de datos de Fecha y hora extendida (microsoft.com)). Aunque no se han realizado pruebas con este último tipo de datos, se supone que el comportamiento será el mismo que con el tipo Número Grande: incompatibilidad de los drivers.
Por último, y a modo de ejemplo, se cita el artículo Incorrect sorting with Decimal fields con el que se puede comprobar como Microsoft no tiene intención de arreglar los problemas del motor de esta base de datos, ni siquiera cuando crean otro motor nuevo.
Resaltar que, en el año 1995, la posibilidad de tener una base de datos de escritorio que podía admitir 1 GB de datos era algo asombroso. Sin embargo, en 2024, esa capacidad (2 GB en las versiones de 64 bits) va a ser claramente insuficiente para una gran cantidad de aplicaciones sencillas pero que almacenan gran cantidad de datos, como pueden ser series históricas. Ello también hace que se pierda el interés en el desarrollo de aplicaciones basadas en este motor.
Por último, indicar que la información online sobre MS Access que Microsoft pone a disposición de los usuarios es escasa, francamente muy mala y con errores. Como muestra, los tipos de datos de MS Access se encuentran muy mal descritos en: Introducción a los tipos de datos y las propiedades de los campos (microsoft.com) y en Tipos de datos para bases de datos de escritorio de Access (microsoft.com).
| Tipo de Datos | Asignación de almacenamiento nominal | Intervalo de valores |
|---|---|---|
| Decimal | 12 bytes | De 0 a +/-9999999999999999999999999999 (+/-9,9...E+27) sin separador decimal De 0 a +/-9,999999999999999999999999999 con 27 posiciones a la derecha del separador decimal. El número menor distinto de cero es +/-0,0000000000000000000000000001 (+/-1E-28). |
| Single | 4 bytes | De -3,402823E+38 a -1,401298E-45 para valores negativos. De 1,401298E-45 a 3,402823E+38 para valores positivos. Los valores son redondeados a 7 dígitos significativos. |
| Double | 8 bytes | De -1,79769313486231570E+308 a -4,94065645841246544E-324 para valores negativos. De 4,94065645841246544E-324 a 1,79769313486231570E+308 para valores positivos. Los valores son redondeados a 15 dígitos significativos. |
| Byte | 1 byte | De 0 a 255 (sin signo). |
| Entero | 2 bytes | De -32768 a 32767 (con signo). |
| Entero Largo | 4 bytes | De -2147483648 a 2147483647 (con signo). |
| Fecha Hora | 8 bytes | De 1 enero de 0100 a las 00:00:00 a 31 diciembre de 9999 a las 23:59:59. |
Este capítulo muestra los resultados de los comportamientos de diferentes proveedores de datos y drivers de MS Access ante diferentes situaciones no contempladas en los capítulos anteriores. Se espera con ello ayudar a resolver problemas y dudas respecto al comportamiento de Excel To Database.
Drivers MS Access
Resaltar que no se han encontrado las especificiones de los drivers por ningún lado. Así, durante las pruebas se intentarán encontrar los límites de dichos drivers para MS Access. Dichos límites, como se verá más adelante, son, en algunos casos, de lo más absurdo y arbritarios que se pueden encontrar.
Access es extremadamente sensible a las desconexiones de red. Recomendación: Utiliza siempre rutas UNC (\\Servidor\Carpeta\Base.accdb) en lugar de unidades mapeadas (Z:\Base.accdb). Esto garantiza que la aplicación encuentre el archivo incluso si la sesión del usuario no ha restaurado las conexiones de red.
-
Instalación
Existen varios drivers con los que conectarse a una base de datos MS Access. Dependen del motor de MS Access (Jet 4.0 para “.mdb” y/o ACE para “.mdb” y “.accdb”) y también dependen de la aplicación que los utiliza. Para aplicaciones de 32 bits se deben usar los drives de Jet o de ACE de 32 bits, mientras que para aplicaciones de 64 bits sólo se pueden utilizar los drivers de ACE de 64 bits.
La instalación de dichos drivers tampoco es sencilla. Mientras que los drivers de Jet de 32 bits vienen ya instalados con el sistema operativo, la instalación de los drivers de ACE son un auténtico dolor: Se debe decidir si instalar los de 32 o 64 bits y, además, se debe tener en cuenta si hay una instalación de Office y qué versión es.
Los drivers se pueden descargar de: Download Microsoft Access Database Engine 2016 Redistributable from Official Microsoft Download Center (ACE 16). Para Office 2013 se puede descargar una versión del motor de MS Access de Download Microsoft Access 2013 Runtime from Official Microsoft Download Center (ACE 15), aunque no es muy recomendable.
Ya no se encuentra disponible la descarga de "Microsoft Access Database Engine 2010 Redistributable from Official Microsoft Download Center" (ACE 12).Aunque existen nuevas versiones de MS Access (2019, 2021 y 2024) Microsoft no proporciona ningún driver nuevo. Y por último, indicar que instalar los driver a partir de Microsoft 365 Access Runtime es tal pesadilla que no merece la pena ni intentarlo ( Descargar e instalar Microsoft 365 Access Runtime, No se pueden usar las interfaces ODBC, OLEDB o DAO de Access fuera de las aplicaciones de hacer clic y ejecutar de Office).
En nuestro caso, partimos de un Sistema Operativo Windows 10 de 64 bits con Office 2019 de 64 bits instalado y los drivers ACE 12 y ACE 16 de 64 bits instalados. Cuando se intenta instalar el driver ACE 16 de 32 bits aparece el error mostrado en la siguiente figura:
Error Instalación ACE 16 x32
El mensaje de error mostrado es totalmente absurdo, ya que se supone que debería ser independiente de la instalación de MS Access u Office. Sin embargo, la instalación de 32 bits de ACE 12 no produce ningún error inesperado, lo cual es lo esperado.
Este error se puede obviar realizando una instalación desde línea de comandos y añadiendo el parámetro "/passive" (https://stackoverflow.com/a/56095027) o "/quiet" ( How to install 64-bit Microsoft Access database engine alongside 32-bit Microsoft Office?). -
Aplicación de 32 bits
Aunque no está planificada la publicación de Excel To Database de 32 bits, se ha construido una versión de la misma para la realización de las pruebas. Si algún usuario necesita dicha versión se puede poner en contacto con nosotros a través de "Contacto" y se valorará la posibilidad de publicar dicha versión de 32 bits.
Sin embargo, para tratar de aclarar las ideas y con fines demostrativos, se muestran algunas capturas de pantalla para dicha solución.
La principal diferencia con respecto a la versión de 64 bits es la posibilidad de utilizar el driver de Jet 4.0, integrado en el sistema operativo, y que permite conexiones con bases de datos “.mdb”. Es posible que dicho driver pueda conectarse con versiones de Access anteriores a 2002, aunque no se han realizado las pruebas oportunas.
Drivers Jet y ACE - Excel To Database 32 bits
-
Aplicación de 64 bits
En el caso de aplicaciones de 64 bits es necesario la instalación de los drivers de 64 bits. Como se puede observar en la figura, se encuentran instalados los drivers ACE 12 y ACE 16 de 64 bits. Excel To Database se entrega como una aplicación de 64 bits.
Drivers ACE - Excel To Database 64 bits
-
Big Int/Date Time Extended
Actualmente existen varios formatos de bases de datos de MS Access. Dentro de las bases de datos con extensión “.accdb” existe un formato para las versiones que van del 2007 al 2016, y otro formato que va del 2016, versión 1703, en adelante. Este nuevo formato admite dos tipos de datos nuevos: Big Int (Número Grande) y Date Time Extended (Fecha y Hora Extendidas).
Dichos tipos de datos están pensados para vincular tablas de MS Access a tablas de SQL Server, como se puede leer aquí: Usar el tipo de datos de Fecha y hora extendida.Se puede crear una base de datos de este tipo marcando la opción "Admitir tipos de datos de número grande (BigInt) para tablas vinculadas o importadas" y creando una tabla que contiene este tipo de datos. En la figura siguiente se muestra dicha tabla y la opción marcada.
MS Access con datos tipo BigInt
Estas dos cosas van a hacer que el formato de la base de datos no sea compatible con ninguno de los drivers que publica Microsoft. Es otro indicio del estado de abandono de MS Access. Así, al intentar establecer una conexión a este nuevo formato de bases de datos obtenemos el siguiente error:
Error MS Access Nuevo Formato con Driver ACE
Como se puede observar en la figura, el driver utilizado es la última versión (ACE 16) y el mensaje de error observado (totalmente absurdo) se interpreta como que el nuevo formato de base de datos no es compatible con dicho driver. Este error aparece tanto en los proveedores de datos OLE DB como ODBC.
Libros, Bases de Datos
Se parte de un Sistema Operativo Windows 10 de 64 bits con una configuración regional de Español (España). Ello implica que tiene definido como "Símbolo decimal" la coma "," y como "Símbolo de separación de miles" el punto ".". Precisamente lo contrario a lo que se define en las culturas anglosajonas. En dicho Sistema Operativo se ha instalado un Microsoft Office Professional Plus 2019 de 64 bits con una configuración de Español (España).
-
Bases de Datos
Con el fin de mostrar el comportamiento de las diferentes opciones de la aplicación, se han preparado una serie de tablas para MS Access, SQL Server y Oracle y varios Libros Excel. Los scripts de creación de tablas, los libros, las bases de datos MS Access y el fichero de Configuraciones para todos los capítulos se pueden descargar de: "Descarga de Ejemplos".
Los scripts de creación de tablas también se muestran en la documentación, así como las Hojas Excel utilizadas en cada momento (como imágenes).• MS Access MDB.mdb: Base de Datos con Formato de Access 2000 – 2003 correspondiente al motor Jet 4.0 • MS Access ACCDB.accdb: Base de datos con Formato de Access 2007-2016 correspondiente con el motor ACE 16 • MS Access ACCDB Con BigInt.accdb: Base de Datos con Formato de Access 2016 (versión 1703 o superior) correspondiente con el motor ACE 16. Se preparan 4 Configuraciones con las siguientes conexiones a la Bases de Datos: • Conexión con Driver ACE 16 a “MS Access ACCDB.accdb”: Provider=Microsoft.ACE.OLEDB.16.0;Data Source=\"G:\\MSAccess\\MS Access ACCDB.accdb\" • Conexión con Driver ACE 16 a “MS Access MDB.mdb”: Provider=Microsoft.ACE.OLEDB.16.0;Data Source=\"G:\\MSAccess\\MS Access MDB.mdb\" • Conexión con ODBC a “MS Access ACCDB.accdb”: Driver={Microsoft Access Driver (*.mdb, *.accdb)};dbq=G:\\MSAccess\\MS Access ACCDB.accdb;defaultdir=G:\\MSAccess;driverid=25;fil=MS Access;filedsn=G:\\MSAccess\\MSAccess_ODBC_ACCDB_X64.dsn;maxbuffersize=2048;maxscanrows=8;pagetimeout=5;safetransactions=0;threads=3;uid=admin;usercommitsync=Yes;app=Excel To Database • Conexión con ODBC a “MS Access MDB.mdb”: Driver={Microsoft Access Driver (*.mdb, *.accdb)};dbq=G:\\MSAccess\\MS Access MDB.mdb;defaultdir=G:\\MSAccess;driverid=25;fil=MS Access;filedsn=G:\\MSAccess\\MSAccess_ODBC_MDB_X64.dsn;maxbuffersize=2048;maxscanrows=8;pagetimeout=5;safetransactions=0;threads=3;uid=admin;usercommitsync=Yes;app=Excel To Database Las conexiones ODBC utilizan los siguientes archivos DSN: MSAccess_ODBC_ACCDB_X64.dsn [ODBC] DRIVER=Microsoft Access Driver (*.mdb, *.accdb) UID=admin UserCommitSync=Yes Threads=3 SafeTransactions=0 PageTimeout=5 MaxScanRows=8 MaxBufferSize=2048 FIL=MS Access DriverId=25 DefaultDir=G:\MSAccess DBQ=G:\MSAccess\MS Access ACCDB.accdb MSAccess_ODBC_MDB_X64.dsn [ODBC] DRIVER=Microsoft Access Driver (*.mdb, *.accdb) UID=admin UserCommitSync=Yes Threads=3 SafeTransactions=0 PageTimeout=5 MaxScanRows=8 MaxBufferSize=2048 FIL=MS Access DriverId=25 DefaultDir=G:\MSAccess DBQ=G:\MSAccess\MS Access MDB.mdbEn ambas conexiones ODBC se utiliza el Driver {Microsoft Access Driver (*.mdb, *.accdb)} de 64 bits con versión 16.00.4999.1000 (ACEODBC.DLL) con fecha 14/07/2020.
En las conexiones OLE DB se utiliza el Driver Microsoft.ACE.OLEDB.16.0 de 64 bits con versión 16.0.5032.1000 con fecha 14/07/2020.Aunque este documento no es un tutorial de creación de cadenas de conexión, si se comenta que puede ser posible que tenga problemas con los nombres de los directorios si tienen espacios en blanco.
-
Libro Excel
Para las pruebas realizadas se ha utilizado un Libro Excel cuyas Hojas se irán mostrando en imágenes a lo largo del capítulo.
Por supuesto, para dichas pruebas se utilizado Excel To Database de 64 bits.
Destacar que para las pruebas no se ha incluido ninguna celda con error, por lo que la opción Sin Valores Error no va a ser utilizada.
Los datos han sido preparados de forma que permitan comprobar el funcionamiento de la carga de datos. No son una batería de pruebas exhaustivas, por lo que se puede deducir que la carga de datos no tiene garantía de que se produzca como el usuario pudiese esperar ni como se describe en esta página.
Puede descargar los ficheros de prueba desde aquí: Descarga de Ejemplos
Pruebas MS Access: Números
-
El extraño caso de OLEDB con Decimal y Moneda
Desde tiempos inmemorables, este tipo de datos siempre ha dado problemas con las conexiones de tipo OLE DB a MS Access. Parece ser que está irremediablemente unido a la configuración regional establecida en Windows. Así, si se ha indicado que el separador de decimales es algo diferente a un punto, no se insertarán adecuadamente los datos en este tipo de campos. Lo cual nos vuelve a confirmar que MS Access lleva en un total abandono desde hace mucho tiempo.
Las pruebas se han realizado en un Windows 10 con una configuración regional de Español (España). Ello implica que tiene definido como "Símbolo decimal" la coma "," y como "Símbolo de separación de miles" el punto ".". Precisamente lo contrario a lo que se define en las culturas anglosajonas.
Configuración Regional
Con esta configuración regional, al intentar cargar datos en campos de tipo "Decimal" o "Moneda", el proveedor de datos sustituye el separador decimal usado internamente por Excel (el punto) por el separador decimal de la configuración regional (la coma), de forma que durante la inserción de los datos se produce un error.
Utilizando los datos que se mencionan en MS Access: Redondeo Decimal, al insertar la primera fila se produce el error mostrado a continuación porque el proveedor de datos, realmente está intentando insertar los valores 0,0000000000000000000000000010 para Decimal_0_28, 0,1234 para Decimal_19_4 y Moneda y 0,12 para Decimal_4_2
Tenga en cuenta que en el mensaje de error se presentan los valores tal y como Excel To Database se los entrega al driver.Fila: 1 Comando: INSERT INTO [Tabla Redondeo Decimal] ([Decimal_0_28], [Decimal_28_0], [Decimal_19_4], [Moneda], [Decimal_4_2], [Driver], [Proveedor Datos]) VALUES (?, ?, ?, ?, ?, ?, ?) Comando Select: SELECT [Decimal_0_28], [Decimal_28_0], [Decimal_19_4], [Moneda], [Decimal_4_2], [Driver], [Proveedor Datos] FROM [Tabla Redondeo Decimal] Excepción: { "$id": "1", "$type": "System.Data.OleDb.OleDbException, System.Data", "ErrorCode": -2147217913, "Errors": { "$type": "System.Data.OleDb.OleDbErrorCollection, System.Data", "$values": [ { "$id": "2", "$type": "System.Data.OleDb.OleDbError, System.Data", "Message": "Data type mismatch in criteria expression.", "NativeError": -539888598, "Source": "Microsoft Access Database Engine", "SQLState": "3464" } ] }, "Message": "Data type mismatch in criteria expression.", "Data": { "$type": "System.Collections.ListDictionaryInternal, mscorlib" }, "InnerException": null, "HelpLink": null, "Source": "Microsoft Access Database Engine", "HResult": -2147217913 } Columna: Decimal_0_28 Valor: 0.0000000000000000000000000010 Columna: Decimal_28_0 Valor: 9999999999999999999999999 Columna: Decimal_19_4 Valor: 0.1234 Columna: Moneda Valor: 0.1234 Columna: Decimal_4_2 Valor: 0.12 Columna: Driver Valor: Microsoft.ACE.OLEDB.16.0 Columna: Proveedor Datos Valor: OLE DB Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Decimal'. Error en la Fila: 1 Query que indica las columnas utilizadas de la Tabla: SELECT [Decimal_0_28], [Decimal_28_0], [Decimal_19_4], [Moneda], [Decimal_4_2], [Driver], [Proveedor Datos] FROM [Tabla Redondeo Decimal] { "$id": "1", "$type": "System.Data.OleDb.OleDbException, System.Data", "ErrorCode": -2147217913, "Errors": { "$type": "System.Data.OleDb.OleDbErrorCollection, System.Data", "$values": [ { "$id": "2", "$type": "System.Data.OleDb.OleDbError, System.Data", "Message": "Data type mismatch in criteria expression.", "NativeError": -539888598, "Source": "Microsoft Access Database Engine", "SQLState": "3464" } ] }, "Message": "Data type mismatch in criteria expression.", "Data": { "$type": "System.Collections.ListDictionaryInternal, mscorlib" }, "InnerException": null, "HelpLink": null, "Source": "Microsoft Access Database Engine", "HResult": -2147217913 }No solamente existe esta casuística, en StackOverflow answer se comentan otro tipo de casos.
Sin embargo, si en la configuración regional se sustituye el "Símbolo decimal" por el punto "." y como "Símbolo de separación de miles" por la coma ",", la carga funciona correctamente.
Excel To Database presenta un mensaje cuando detecta este problema. En esos momentos se puede cambiar la Configuración Regional de Windows, continuar con la carga de datos, y al finalizar volver a restaurar la configuración previa.Destacar que este error no existe con los drivers ODBC.
-
Números de "Punto Flotante"
Para mostrar el comportamiento de los drivers con este tipo de datos de MS Access se utiliza una tabla cuyo script de creación es el mostrado a continuación. La Hoja Excel utilizada es la mostrada en la figura siguiente.
Indicar que para que el proveedor de datos OLE DB funcione correctamente NO es necesario que en la Configuración Regional de Windows se especifique como "Símbolo decimal" el punto ".". Esto sólo es necesario para los tipos de datos "Decimal" y "Moneda".
Public Sub CreaTablaNumeros() On Error Resume Next CurrentProject.Connection.Execute "DROP TABLE [Tabla Numeros]" On Error GoTo Sub_Err CurrentProject.Connection.Execute "CREATE TABLE [Tabla Numeros](" & _ "[Id] COUNTER NOT NULL, " & _ "[Proveedor Datos] TEXT (255) NOT NULL, " & _ "[Driver] TEXT (255) NOT NULL, " & _ "[Simple_3_Fijo] SINGLE, " & _ "[Simple_3_General] SINGLE, " & _ "[Doble_3] DOUBLE" & _ ")" Dim db As Object, tbl As Object, fld As DAO.Field Set db = CurrentDb db.TableDefs.Refresh Set tbl = db.TableDefs("Tabla Numeros") tbl.Fields.Refresh Set fld = tbl.Fields("Proveedor Datos") fld.AllowZeroLength = False fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True) Set fld = tbl.Fields("Driver") fld.AllowZeroLength = False fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True) Set fld = tbl.Fields("Simple_3_Fijo") fld.Properties.Append fld.CreateProperty("DecimalPlaces", 2, 3) fld.Properties.Append fld.CreateProperty("Format", 10, "Fixed") fld.Properties.Append fld.CreateProperty("Description", 10, "Ver: https://www.uvm.edu/~bnelson/computer/access2003/howaccesstreatsdecimalplaces.html. 4 Bytes") Set fld = tbl.Fields("Simple_3_General") fld.Properties.Append fld.CreateProperty("DecimalPlaces", 2, 3) fld.Properties.Append fld.CreateProperty("Format", 10, "General Number") fld.Properties.Append fld.CreateProperty("Description", 10, "Ver: https://www.uvm.edu/~bnelson/computer/access2003/howaccesstreatsdecimalplaces.html. 4 Bytes") Set fld = tbl.Fields("Doble_3") fld.Properties.Append fld.CreateProperty("DecimalPlaces", 2, 3) fld.Properties.Append fld.CreateProperty("Description", 10, "Ver: https://www.uvm.edu/~bnelson/computer/access2003/howaccesstreatsdecimalplaces.html. 8 Bytes") CurrentProject.Connection.Execute "CREATE UNIQUE INDEX PrimaryKey ON [Tabla Numeros] (Id ASC) WITH PRIMARY" Sub_Exit: Set fld = Nothing Set tbl = Nothing If Not db Is Nothing Then db.Close Set db = Nothing Exit Sub Sub_Err: MsgBox "Se ha producido un error en 'CreaTablaNumeros'." & vbNewLine & vbNewLine & vbTab & Err.Description, , "Error Nº: " & Err.Number Resume Sub_Exit Resume End SubMS Access: Hoja Excel para Números de "Punto Flotante"
Hay que destacar que el formato de celdas en la Hoja Excel es "Texto", "Número" o "Científica". Es "Texto" para aquellos casos en que se supera la precisión de Excel. En estos casos se utiliza como "Símbolo decimal" el punto ".", ya que es el separador que utiliza Excel To Database para convertir los textos a números.
Los campos "Simple_3_Fijo" y "Simple_3_General" son campos de tipo "Single"; campos numéricos de punto flotante de hasta 7 dígitos significativos. El "3" en el nombre se refiere a que se ha indicado que MS Access muestre solamente 3 decimales del dato almacenado en el campo ("Lugares decimales" = 3). El primer campo tiene un formato definido "Fijo", lo cual hace que se muestre el dato redondeado a 3 decimales, y el segundo "Número general", que hace que se muestre el dato tal y como se encuentra almacenado en la base de datos.
En How Access Treats Decimal Places se puede encontrar una breve descripción de como MS Access trata los decimales en función del tipo de campo ("Tipo de datos" y "Tamaño del campo"), el formato para la presentación del campo ("Formato") y la cantidad de decimales que se desean presentar ("Lugares decimales").
El campo "Doble_3" es una campo numérico de punto flotante de hasta 15 dígitos significativos. El comportamiento de este campo y los campos de tipo "Single" es el mismo, salvo en la precisión.Ambos proveedores de datos (OLE DB y ODBC) redondean el dato cuando éste excede la precisión del campo. El redondeo utilizado es del tipo MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.
Se han puesto a prueba las máximas capacidades de Excel, MS Access y de .NET, obteniéndose los resultados esperados con ambos proveedores de datos. Se ha de tener en cuenta que tanto MS Access como .NET tienen una precisión de 7 dígitos significativos para Single y 15 para Double. Así, datos con mayor precisión pueden ser redondeados a esta precisión: .NET lo hace en las celdas "C6", "A15", "B15", "B16", "C20", "A21", "B21" y "C21" y MS Access lo hace en las celdas "A12:A14", "B12:B14", "C4", "C7:C9" y "C19".
Por último indicar que las celdas "A22:B22" son insertadas como NULL por Excel To Database, sin embargo, MS Access puede alamcenar para estos datos los valores 1.#INF (con OLE DB) o inf,000 (con ODBC).
Pruebas MS Access: Fechas
Para mostrar el comportamiento de esta opción con MS Access se utiliza la Base de Datos del apartado anterior que contiene la siguiente tabla y el Libro Excel del apartado anterior. Del Libro Excel se utilizará la Hoja mostrada en la figura siguiente:
Indicar que para que el proveedor de datos OLE DB funcione correctamente NO es necesario que en la Configuración Regional de Windows se especifique como "Símbolo decimal" el punto ".". Esto sólo es necesario para los tipos de datos "Decimal" y "Moneda".
Option Compare Database
Option Explicit
Public Sub CreaTablaFechas()
On Error Resume Next
CurrentProject.Connection.Execute "DROP TABLE [Tabla Fechas]"
On Error GoTo Sub_Err
CurrentProject.Connection.Execute "CREATE TABLE [Tabla Fechas](" & _
"[Id] COUNTER NOT NULL, " & _
"[Proveedor Datos] TEXT (255) NOT NULL, " & _
"[Driver] TEXT (255) NOT NULL, " & _
"[Fecha/Hora 1] DATETIME, " & _
"[Fecha/Hora 2] DATETIME, " & _
"[Fecha/Hora 3] DATETIME, " & _
"[Fecha/Hora 4] DATETIME" & _
")"
Dim db As Object, tbl As Object, fld As Object
Set db = CurrentDb
db.TableDefs.Refresh
Set tbl = db.TableDefs("Tabla Fechas")
tbl.Fields.Refresh
Set fld = tbl.Fields("Proveedor Datos")
fld.AllowZeroLength = False
fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True)
Set fld = tbl.Fields("Driver")
fld.AllowZeroLength = False
fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True)
Set fld = tbl.Fields("Fecha/Hora 1")
fld.Properties.Append fld.CreateProperty("Description", 10, "Entre los años 100 y 9999. No es Fecha/Hora Extendida")
fld.Properties.Append fld.CreateProperty("Format", 10, "General Date")
Set fld = tbl.Fields("Fecha/Hora 2")
fld.Properties.Append fld.CreateProperty("Description", 10, "Entre los años 100 y 9999. No es Fecha/Hora Extendida")
fld.Properties.Append fld.CreateProperty("Format", 10, "General Date")
Set fld = tbl.Fields("Fecha/Hora 3")
fld.Properties.Append fld.CreateProperty("Description", 10, "Entre los años 100 y 9999. No es Fecha/Hora Extendida")
fld.Properties.Append fld.CreateProperty("Format", 10, "General Date")
Set fld = tbl.Fields("Fecha/Hora 4")
fld.Properties.Append fld.CreateProperty("Description", 10, "Entre los años 100 y 9999. No es Fecha/Hora Extendida")
fld.Properties.Append fld.CreateProperty("Format", 10, "General Date")
CurrentProject.Connection.Execute "CREATE UNIQUE INDEX PrimaryKey ON [Tabla Fechas] (Id ASC) WITH PRIMARY"
Sub_Exit:
Set fld = Nothing
Set tbl = Nothing
If Not db Is Nothing Then db.Close
Set db = Nothing
Exit Sub
Sub_Err:
MsgBox "Se ha producido un error en 'CreaTablaFechas'." & vbNewLine & vbNewLine & vbTab & Err.Description, , "Error Nº: " & Err.Number
Resume Sub_Exit
Resume
End Sub
MS Access: Hoja Excel Fechas
Para comprender correctamente el funcionamiento de las fechas en Excel, se recomienda leer y entender el apartado: Fechas Excel.
En primer lugar, hay que destacar que MS Access no tiene tipos de datos para almacenar sólo fechas o sólo horas. El mismo tipo de datos sirve para ambas cosas. Al igual que Excel, MS Access utiliza una fecha de referencia para mostrar sólo las horas: 30/12/1899 (la misma que en Excel).
El rango de celdas "A12:D12" tiene un Fromtato de Celda "Personaizado: hh:mm:ss,000" y Excel lo almacena como una Fecha (30/12/1899) con Hora.
Sin embargo, el rango de celdas "A13:D13" tiene un Formato de Celda "Texto". Excel To Database es capaz de interpretarlo correctamente, añadirle la fecha de referencia y almacenarlo correctamente en MS Access.
MS Access sólo admite fechas comprendidas entre los años 100 y 9999. Sólo los campos de tipo "Fecha/Hora Extendidas" admiten un rango y precisión mayor.
MS Access tiene una precisión de segundos, por lo que los drivers (ODBC y OLE DB) truncan los datos que contengan mayor precisión. Es posible que en sucesivas versiones de Excel To Database se pueda optar por realizar un redondeo en este tipo de casos.
-
Error de Conversión en Fechas
En la Hoja Excel, los datos contenidos en los rangos "B2:D2" y "B7:D7" corresponden a fechas de años que no fueron bisiestos. Los datos de los rangos "B6:D6" y "B11:D11" contienen errores.
Excel NO reconoce el dato como una Fecha y falla en el punto 2º. Excel To Database lo indica con los siguientes mensajes (en el primer error se indican los formatos que se han utilizado para realizar la conversión del dato).
Con la opción "Sin Errores de Conversión" esos datos hubiesen sido sustituidos por el Valor Por Defecto indicado en el Panel de Mapeos y se hubiese podido lanzar la fase de carga de datos.Un caso especial es el dato de la celda "D2" (29/02/1900). Excel la reconoce como una fecha válida (Formato de Celda "Fecha") y Excel To Database la va a cargar como 28/02/1900, ya que dicha fecha nunca ha existido.
Sin embargo, el dato de la celda "D7" ("29/02/1900") no es reconocido como una fecha por Excel (Formato de Celda "Texto") y cuando Excel To Database intenta convertir dicho dato se producirá un "Error de Conversión de Tipo" porque esa fecha no ha existido.Celda: B2, Valor: 29/02/1700, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Para las fechas con formato de texto se admiten estos formatos: dd/MM/yyyy dd/MM/yy d/MM/yy d/M/yy d-M-yy dd-MM-yy dd.MM.yy yyyy-MM-dd dddd, d' de 'MMMM' de 'yyyy dddd d' de 'MMMM' de 'yyyy d' de 'MMMM' de 'yyyy dddd, d' de 'MMMM' de 'yyyy H:mm dddd, d' de 'MMMM' de 'yyyy HH:mm dddd, d' de 'MMMM' de 'yyyy H.mm dddd, d' de 'MMMM' de 'yyyy HH.mm dddd, d' de 'MMMM' de 'yyyy HH'H'mm dddd d' de 'MMMM' de 'yyyy H:mm dddd d' de 'MMMM' de 'yyyy HH:mm dddd d' de 'MMMM' de 'yyyy H.mm dddd d' de 'MMMM' de 'yyyy HH.mm dddd d' de 'MMMM' de 'yyyy HH'H'mm d' de 'MMMM' de 'yyyy H:mm d' de 'MMMM' de 'yyyy HH:mm d' de 'MMMM' de 'yyyy H.mm d' de 'MMMM' de 'yyyy HH.mm d' de 'MMMM' de 'yyyy HH'H'mm dddd, d' de 'MMMM' de 'yyyy H:mm:ss dddd, d' de 'MMMM' de 'yyyy HH:mm:ss dddd, d' de 'MMMM' de 'yyyy H.mm.ss dddd, d' de 'MMMM' de 'yyyy HH.mm.ss dddd, d' de 'MMMM' de 'yyyy HH'H'mm.ss dddd d' de 'MMMM' de 'yyyy H:mm:ss dddd d' de 'MMMM' de 'yyyy HH:mm:ss dddd d' de 'MMMM' de 'yyyy H.mm.ss dddd d' de 'MMMM' de 'yyyy HH.mm.ss dddd d' de 'MMMM' de 'yyyy HH'H'mm.ss d' de 'MMMM' de 'yyyy H:mm:ss d' de 'MMMM' de 'yyyy HH:mm:ss d' de 'MMMM' de 'yyyy H.mm.ss d' de 'MMMM' de 'yyyy HH.mm.ss d' de 'MMMM' de 'yyyy HH'H'mm.ss dd/MM/yyyy H:mm dd/MM/yyyy HH:mm dd/MM/yyyy H.mm dd/MM/yyyy HH.mm dd/MM/yyyy HH'H'mm dd/MM/yy H:mm dd/MM/yy HH:mm dd/MM/yy H.mm dd/MM/yy HH.mm dd/MM/yy HH'H'mm d/MM/yy H:mm d/MM/yy HH:mm d/MM/yy H.mm d/MM/yy HH.mm d/MM/yy HH'H'mm d/M/yy H:mm d/M/yy HH:mm d/M/yy H.mm d/M/yy HH.mm d/M/yy HH'H'mm d-M-yy H:mm d-M-yy HH:mm d-M-yy H.mm d-M-yy HH.mm d-M-yy HH'H'mm dd-MM-yy H:mm dd-MM-yy HH:mm dd-MM-yy H.mm dd-MM-yy HH.mm dd-MM-yy HH'H'mm dd.MM.yy H:mm dd.MM.yy HH:mm dd.MM.yy H.mm dd.MM.yy HH.mm dd.MM.yy HH'H'mm yyyy-MM-dd H:mm yyyy-MM-dd HH:mm yyyy-MM-dd H.mm yyyy-MM-dd HH.mm yyyy-MM-dd HH'H'mm dd/MM/yyyy H:mm:ss dd/MM/yyyy HH:mm:ss dd/MM/yyyy H.mm.ss dd/MM/yyyy HH.mm.ss dd/MM/yyyy HH'H'mm.ss dd/MM/yy H:mm:ss dd/MM/yy HH:mm:ss dd/MM/yy H.mm.ss dd/MM/yy HH.mm.ss dd/MM/yy HH'H'mm.ss d/MM/yy H:mm:ss d/MM/yy HH:mm:ss d/MM/yy H.mm.ss d/MM/yy HH.mm.ss d/MM/yy HH'H'mm.ss d/M/yy H:mm:ss d/M/yy HH:mm:ss d/M/yy H.mm.ss d/M/yy HH.mm.ss d/M/yy HH'H'mm.ss d-M-yy H:mm:ss d-M-yy HH:mm:ss d-M-yy H.mm.ss d-M-yy HH.mm.ss d-M-yy HH'H'mm.ss dd-MM-yy H:mm:ss dd-MM-yy HH:mm:ss dd-MM-yy H.mm.ss dd-MM-yy HH.mm.ss dd-MM-yy HH'H'mm.ss dd.MM.yy H:mm:ss dd.MM.yy HH:mm:ss dd.MM.yy H.mm.ss dd.MM.yy HH.mm.ss dd.MM.yy HH'H'mm.ss yyyy-MM-dd H:mm:ss yyyy-MM-dd HH:mm:ss yyyy-MM-dd H.mm.ss yyyy-MM-dd HH.mm.ss yyyy-MM-dd HH'H'mm.ss d 'de' MMMM yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK ddd, dd MMM yyyy HH':'mm':'ss 'GMT' yyyy'-'MM'-'dd'T'HH':'mm':'ss H:mm HH:mm H.mm HH.mm HH'H'mm H:mm:ss HH:mm:ss H.mm.ss HH.mm.ss HH'H'mm.ss yyyy'-'MM'-'dd HH':'mm':'ss'Z' MMMM' de 'yyyy MM/dd/yyyy dddd, dd MMMM yyyy dddd, dd MMMM yyyy HH:mm dddd, dd MMMM yyyy hh:mm tt dddd, dd MMMM yyyy H:mm dddd, dd MMMM yyyy h:mm tt dddd, dd MMMM yyyy HH:mm:ss MM/dd/yyyy HH:mm MM/dd/yyyy hh:mm tt MM/dd/yyyy H:mm MM/dd/yyyy h:mm tt yyyy-MM-dd hh:mm tt yyyy-MM-dd h:mm tt MM/dd/yyyy HH:mm:ss MMMM dd hh:mm tt h:mm tt yyyy MMMM Celda: B2, Valor: 29/02/1700, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <29/02/1700> en la columna Fecha/Hora 2. El tipo esperado es DateTime. Celda: C2, Valor: 29/02/1800, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: C2, Valor: 29/02/1800, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <29/02/1800> en la columna Fecha/Hora 3. El tipo esperado es DateTime. Celda: B6, Valor: 00/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: B6, Valor: 00/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <00/00/1900> en la columna Fecha/Hora 2. El tipo esperado es DateTime. Celda: C6, Valor: 01/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: C6, Valor: 01/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <01/00/1900> en la columna Fecha/Hora 3. El tipo esperado es DateTime. Celda: D6, Valor: 00/01/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: D6, Valor: 00/01/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <00/01/1900> en la columna Fecha/Hora 4. El tipo esperado es DateTime. Celda: B7, Valor: 29/02/1700, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: B7, Valor: 29/02/1700, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <29/02/1700> en la columna Fecha/Hora 2. El tipo esperado es DateTime. Celda: C7, Valor: 29/02/1800, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: C7, Valor: 29/02/1800, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <29/02/1800> en la columna Fecha/Hora 3. El tipo esperado es DateTime. Celda: D7, Valor: 29/02/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: D7, Valor: 29/02/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <29/02/1900> en la columna Fecha/Hora 4. El tipo esperado es DateTime. Celda: B11, Valor: 00/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: B11, Valor: 00/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <00/00/1900> en la columna Fecha/Hora 2. El tipo esperado es DateTime. Celda: C11, Valor: 01/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: C11, Valor: 01/00/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <01/00/1900> en la columna Fecha/Hora 3. El tipo esperado es DateTime. Celda: D11, Valor: 00/01/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: D11, Valor: 00/01/1900, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <00/01/1900> en la columna Fecha/Hora 4. El tipo esperado es DateTime.Las celdas D3 y D8 no coinciden con ninguno de los formatos que Excel To Database utiliza para poder interpretarlos correctamente (yyyy/dd/MM (año/día/mes)). Así, con estos datos también se producen Errores de Conversión de Tipos. Excel tampoco las interpreta como Fecha, pero no muestra ningún aviso. Sin embargo, los datos contenidos en las celdas "A4", "D4", "A5", "A9", "D9" y "A10" son interpretadas por Excel To Database como "yyyy/MM/dd" (año/mes/día), mientras que Excel no las interpreta como Fecha.
Celda: D3, Valor: 1899/30/12, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: D3, Valor: 1899/30/12, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <1899/30/12> en la columna Fecha/Hora 4. El tipo esperado es DateTime. Celda: D8, Valor: 1899/30/12, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 El contenido de la Celda no ha podido convertirse al tipo de datos DateTime Celda: D8, Valor: 1899/30/12, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <1899/30/12> en la columna Fecha/Hora 4. El tipo esperado es DateTime. -
ODBC y el chovinismo anglosajón: 1753
Cómo ya se ha indicado, MS Access no admite fechas inferiores al 1 de enero del año 100. Excel To Database lo indica con un mensaje y no se lanza la fase de carga de datos.
Celda: B5, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 Valor inferior a la fecha mínima 01/01/0100 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: B5, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <31/12/0099> en la columna Fecha/Hora 2. El tipo esperado es DateTime. Celda: B10, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 Valor inferior a la fecha mínima 01/01/0100 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: B10, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <31/12/0099> en la columna Fecha/Hora 2. El tipo esperado es DateTime.Sin embargo, cuando se utiliza el Proveedor de Datos ODBC, esta fecha límite se atrasa al 1 de enero de 1753. Excel To Database también es consciente de ello y lo indica con el mensaje pertintente.
Celda: B5, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 Valor inferior a la fecha mínima 01/01/1753 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: B5, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <31/12/0099> en la columna Fecha/Hora 2. El tipo esperado es DateTime. Celda: C5, Valor: 01/01/0100, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 Valor inferior a la fecha mínima 01/01/1753 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: D5, Valor: 31/12/1752, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 Valor inferior a la fecha mínima 01/01/1753 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: D5, Valor: 31/12/1752, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <31/12/1752> en la columna Fecha/Hora 4. El tipo esperado es DateTime. Celda: B10, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 Valor inferior a la fecha mínima 01/01/1753 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: B10, Valor: 31/12/0099, Tabla: Tabla Fechas, Columna: Fecha/Hora 2 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <31/12/0099> en la columna Fecha/Hora 2. El tipo esperado es DateTime. Celda: C10, Valor: 01/01/0100, Tabla: Tabla Fechas, Columna: Fecha/Hora 3 Valor inferior a la fecha mínima 01/01/1753 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: D10, Valor: 31/12/1752, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 Valor inferior a la fecha mínima 01/01/1753 00:00:00 admitida por la Columna o el Proveedor de Datos. Celda: D10, Valor: 31/12/1752, Tabla: Tabla Fechas, Columna: Fecha/Hora 4 No se puede reconocer la cadena como valor DateTime válido.No se puede almacenar <31/12/1752> en la columna Fecha/Hora 4. El tipo esperado es DateTime.Si no se utilizan las comprobaciones realizadas por Excel To Database, el mensaje de error que aparecería en los ficheros de .log sería similar al siguiente:
Comando: INSERT INTO [Tabla Fechas] ([Fecha/Hora 1] [Driver], [Proveedor Datos]) VALUES (?, ?, ?) RowError: Datos de la fila a insertar en la tabla: Columna: Fecha/Hora 1 Valor: 01/01/0100 0:00:00 Columna: Driver Valor: Microsoft Access Driver (*.mdb, *.accdb) Columna: Proveedor Datos Valor: ODBC Se ha producido una excepción al intentar cargar la Tabla 'Tabla Fechas'. Query que indica las columnas utilizadas de la Tabla: SELECT [Fecha/Hora 1], [Driver], [Proveedor Datos] FROM [Tabla Fechas] { "$id": "1", "$type": "System.Data.Odbc.OdbcException, System.Data", "Errors": { "$type": "System.Data.Odbc.OdbcErrorCollection, System.Data", "$values": [ { "$id": "2", "$type": "System.Data.Odbc.OdbcError, System.Data", "Message": "[Microsoft][ODBC Microsoft Access Driver]Datetime field overflow ", "SQLState": "22008", "NativeError": 36, "Source": "ACEODBC.DLL" } ] }, "Source": "ACEODBC.DLL", "ErrorCode": -2146232009, "Message": "ERROR [22008] [Microsoft][ODBC Microsoft Access Driver]Datetime field overflow ", "Data": { "$type": "System.Collections.ListDictionaryInternal, mscorlib" }, "InnerException": null, "HelpLink": null, "HResult": -2146232009 }¿A qué se debe este error? Como de costumbre, a razones históricas: 1515. LA UNIVERSIDAD DE SALAMANCA REALIZA UN INFORME PARA LA REFORMA DEL CALENDARIO:
Ya, en 1515 los científicos y matemáticos de la Universidad de Salamanca redactaron un informe poniendo de manifiesto las incongruencias del calendario vigente en la época (establecido por Julio César 46 años antes del nacimiento de Cristo). En 1578 redactaron un segundo informe, esta vez ya tenido en cuenta por el papa Gregorio XIII, que en la bula "Inter Gravissimas" impulsó el cambio de calendario. Su Católica Majestad, Felipe II, mediante una pragmática, el 29 de septiembre de 1582 realizó dicho cambio en todo su Imperio. Sin embargo, Inglaterra no adoptó el calendario gregoriano hasta 1752.
Así, dado el chovinismo de dicha cultura, en el desarrollo de SQL Server y otras tecnologías impusieron como fecha mínima el 1 de Enero de 1753. Microsoft ha eliminado los artículos que se refieren a este problema, sin embargo, todavía se pueden encontrar referencia a ellos en otras páginas, como: Access ODBC returning incorrect dates prior to the year 1753 o en What is the significance of 1/1/1753 in SQL Server?.
Esto no acurre con el Proveedor de Datos OLE DB.
Sin embargo, con fechas anteriores al 1 de enero del año 100, si no se realizasen las comprobaciones que Excel To Database realiza, en el fichero de .log aparecerían mensajes similares al siguiente:
Comando: INSERT INTO [Tabla Fechas] ([Fecha/Hora 1] [Driver], [Proveedor Datos]) VALUES (?, ?, ?) RowError: Datos de la fila a insertar en la tabla: Columna: Fecha/Hora 1 Valor: 01/01/0099 0:00:00 Columna: Driver Valor: Microsoft.ACE.OLEDB.16.0 Columna: Proveedor Datos Valor: OLE DB Se ha producido una excepción al intentar cargar la Tabla 'Tabla Fechas MSAccess ACCDB'. Query que indica las columnas utilizadas de la Tabla: SELECT [Fecha/Hora 1], [Driver], [Proveedor Datos] FROM [Tabla Fechas] { "$id": "1", "$type": "System.OverflowException, mscorlib", "Message": "OleAut no es una fecha válida.", "Data": { "$type": "System.Collections.ListDictionaryInternal, mscorlib" }, "InnerException": null, "HelpLink": null, "Source": "System.Data", "HResult": -2146233066 }Si, por el contrario, se ha marcado la opción "Sin Errores de Conversión", estos valores serán sustituidos por el valor por defecto incluido en el Panel de Mapeos y la carga de datos se podrá realizar correctamente.
MS Access: OLE DB – ODBC
La única recomendación posible es la de que el usuario realice las pruebas que considere necesarias antes de poner sus cargas de datos en producción. No es nada nuevo, ya que debería realizar la misma operación utilice el sistema de carga que desee, al final, los proveedores de datos y los drivers serán los mismos.
Destacar los problemas para el Proveedor de Datos OLE DB: separador decimal, redondeos extraños, límites en las fechas. ¿Puedo usar Excel To Database con bases de datos Access protegidas por contraseña? Las interpreta como NULL por defecto, pero permite definir un valor de sustitución personalizado que el software inyectará antes de enviar el dato al driver de la base de datos. ¿Por qué falla la carga masiva en Access y no en SQL Server? Access no es un motor de base de datos de servidor. Tiene límites de concurrencia y tamaño (2GB). Para volúmenes masivos, recomendamos migrar a SQL Server Express.
Con ODBC: truncado de datos y límite de fechas.
En general, para MS Access no se recomienda el uso del tipo de datos Decimal debido a los problemas que genera en las conexiones como a problemas internos a MS Access. Preguntas Frecuentes