Parámetros de cadena de conexión para especificaciones guardadas
Access proporciona un segundo método para describir el esquema de los archivos de texto mediante el uso de tablas del sistema MSysIMEXSpecs
y MSysIMEXColumns
para guardar las especificaciones. En el artículo anterior, cubrí cómo schema.ini
se puede utilizar para describir la estructura de un archivo de texto. El schema.ini
involucró un archivo de texto externo implícitamente referenciado pero con las tablas del sistema, no tenemos ninguna dependencia externa. La estructura es bastante diferente, aunque hay algunas superposiciones.
MSysIMEXSpecs
y MSysIMEXColumns
tabla de sistema
En lugar de depender de que un schema.ini externo esté presente en la misma carpeta que el archivo de texto, es posible proporcionar especificaciones para un archivo de texto en cualquier ruta haciendo referencia a la especificación guardada dentro de la base de datos de Access. Cuando utiliza el asistente de Importación o Exportación, puede guardar o cargar las especificaciones a través de Advanced
botón.
Al hacer clic en el botón avanzado, se mostrará el cuadro de diálogo de especificación. Además de cargar o guardar las especificaciones, también puede personalizar las especificaciones mediante el cuadro de diálogo que se muestra.
Cada vez que se guarda una especificación, se escribe tanto en MSysIMEXSpecs
y MSysIMEXColumns
tablas del sistema. Las tablas no existen en un nuevo archivo de Access y se crearán solo la primera vez. Además, puede editar o incluso eliminar datos de esas tablas. Aun así, siguen siendo tablas del sistema por lo que están ocultas por defecto. Si desea verlos en el panel de navegación, deberá ir a las Opciones de navegación y habilitar la visibilidad para los objetos ocultos y del sistema.
Si compara las opciones disponibles en el cuadro de diálogo con las opciones que tiene en schema.ini
, se pueden ver algunas diferencias notables. Por ejemplo, el schema.ini
permite más opciones con respecto a cómo se pueden formatear las fechas o los montos de moneda. Con las especificaciones guardadas, solo podemos controlar el formato de fecha desde una lista preestablecida de formato posible. No hay opciones directas para los montos de moneda porque usamos el tipo de datos para indicar que una columna se debe importar como moneda, independientemente del formato. Por lo tanto, las opciones de las tablas del sistema son simples en comparación con schema.ini. A continuación revisaremos la estructura de las tablas.
MSysIMEXSpecs
estructura
La tabla representa un conjunto de especificaciones guardadas. Para cada fila, la tabla describe el formato general del archivo, similar a la segunda sección de schema.ini
. Sin embargo, hay diferentes opciones que deben ser consideradas.
DateDelim
:identifica el delimitador de las fechas. Normalmente es/
o-
. Puede ser solo uno o cero caracteres.DateFourDigitYear
:Un campo Sí/No que indica si las fechas tienen formato de cuatro dígitos para años. Si se establece en sí, valores como10/10/20
no se considerarían fechas válidas.DateLeadingZeros
:Otro campo Sí/No que indica si las fechas tienen ceros a la izquierda.DateOrder
:Determina el formato de fecha que queremos usar. Los siguientes códigos son válidos:0
:DMA1
:DYM
2
:MDA3
:MYD
4
:YDM5
:AMD
DecimalPoint
:Indica el carácter para separar la parte entera y fraccionaria de un número decimal. Debe ser exactamente un solo carácter.FieldSeparator
:Separa campos en el archivo de texto. Para un archivo CSV, sería,
(un carácter de coma). Además, debe ser exactamente un solo carácter.FileType
:Similar aschema.ini
'sCharacterSet
. Como se mencionó en el artículo anterior, puede ubicar todas las posibles páginas de códigos admitidas en su máquina con Windows, busque en la clave de registroComputer\HKEY_CLASSES_ROOT\MIME\Database\Codepage\
. Identifica la codificación del archivo de texto. Puede utilizar el mismo identificador de página de códigos. Sin embargo, hay un problema. ElFileType
se define como unInteger
. Por lo tanto, una página de códigos 65000 (por ejemplo, Unicode) se informaría como -536. Para convertir cualquier identificador de página de códigos mayor que 32767, puede usar la fórmulaCInt("&H" & Hex(x))
y para invertir la operación,CLng("&H" & Hex(x))
. Por ejemplo, la conversión de la página de códigos 65000 pasaría porCInt("&H" & Hex(65000))
para producir -536. Para invertir,CLng("&H" & Hex(-536))
para recuperar 65000.SpecID
:Autonumeración para la tabla. Tenga en cuenta que esta no es la clave principal de la tabla. Esta columna se usa conMSysIMEXColumns.SpecID
para relacionar registros. Sin embargo, no existe una restricción de clave externa entre las dos tablas, por lo que pueden ocurrir eliminaciones huérfanas.SpecName
:La clave principal de la tabla. Identifica de forma única la especificación. Siempre que guarde una especificación, el nombre que proporcione se registrará en este campo. Cuando importa o exporta usando asistentes, Access puede crear automáticamente una nueva especificación incluso si no usó elAdvanced
y guardarlo explícitamente.SpecType
:Solo puede ser1
para indicar archivo delimitado o2
para significar archivo de ancho fijo.StartRow
:determina la fila en el archivo de texto para comenzar a escanear para importar. Puede ser cualquier número, por lo que es posible omitir varias líneas en la parte superior del archivo. Puede ser útil para archivos de texto mal formados que tienen encabezados no conformes.TextDelim
:Un solo carácter que delimita un valor de texto. Se puede omitir si el texto no está delimitado. Si puede controlar el formato de los archivos de texto, generalmente es una buena idea tener delimitadores de texto. Un archivo de texto con delimitadores de texto permanecerá bien formado incluso si el texto contiene separadores de campo (por ejemplo, una coma) dentro del texto.TimeDelim
:Indica el carácter delimitador utilizado para la hora. Puede ser cualquier carácter individual o estar en blanco y el valor predeterminado es:
(un carácter de dos puntos).
MSysIMEXColumns
estructura
La tabla describe las columnas individuales en el archivo de texto y cualquier atributo. Esto corresponde aproximadamente a la tercera sección del schema.ini
. Sin embargo, hay opciones adicionales como la indexación que no existe en schema.ini
.
Attributes
:Desconocido. En mis pruebas nunca conseguí que fuera algo más que0
. Si sabe para qué sirve y cómo se puede utilizar, no dude en dejar un comentario.DataType
:el tipo de datos de la columna. El número debe corresponder a DAO.DataTypeEnum.FieldName
:el nombre de la columna. Tenga en cuenta que el acceso predeterminado seráFieldN
dondeN
es un entero positivo.IndexType
:Puede ser0
para indicar que no hay índices,1
para indicar índice regular o2
para indicar un índice único.SkipColumns
:un valor booleano indica si se debe omitir la columna. Si se omite, no estará disponible para consulta o lectura.SpecID
:Corresponde alMSysIMEXSpecs.SpecID
número automático. Tenga en cuenta que no hay restricciones de clave externa entre las dos tablas. Si ha eliminado registros, es posible que haya registros huérfanos deMSysIMEXSpecs
mesa.Start
:un número entero que indica cuándo comienza la columna en el archivo de texto. Es significativo para un archivo de ancho fijo. Para archivos delimitados, Access seguirá usando la posición de columna de la primera fila donde se encuentra el campo para determinar el inicio. Además, Access usará la columna para implicar el orden ordinal de las columnas.Width
:Otro entero para gobernar el tamaño de la columna. En un archivo de ancho fijo, esto también es importante. Tenga en cuenta que Microsoft Access usará esa información para tipos de datos de longitud variable, como texto o binarios, para dimensionar la columna en consecuencia, incluso en un archivo delimitado.
Cadena de conexión usando especificaciones:DSN
parámetro
En el artículo anterior, vio que no hubo ningún cambio en la cadena de conexión para usar un archivo schema.ini. Nos referimos implícitamente a schema.ini
simplemente asegurándonos de que existe en la misma carpeta donde está el archivo de texto que estamos enlazando o abriendo. Sin embargo, para usar las especificaciones guardadas del sistema se requiere que proporcionemos la información en la conexión. Hacemos esto completando el DSN
parámetro. El valor debe hacer referencia al nombre de la especificación guardada, tal como se registra en el MSysIMEXSpecs.SpecName
columna.
Aquí hay una muestra:
Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DSN=Products Link Specification;IMEX=1;DATABASE=C:\Links")
El acceso requerirá que tanto el parámetro DSN como los parámetros IMEX se proporcionen en la cadena de conexión. Si intenta omitir el IMEX
obtendrá un error acerca de que Access no puede encontrar la especificación, aunque la especificación existe en MSysIMEXSpecs
mesa. También se deduce que la tabla debe contener un registro con SpecName
que contiene el mismo valor proporcionado en el DSN
parámetro.
Como se señaló en el artículo anterior, los archivos de texto individuales se tratan como una "tabla" dentro de la "base de datos" de la carpeta. Entonces, aunque la cadena de conexión no apunta a un archivo de texto específico, la cadena de conexión utilizará las especificaciones especificadas en cualquier archivo de texto abierto a través de la conexión.
Si bien es posible usar otros parámetros, como se describe en el mismo artículo, debe tener en cuenta que, en caso de conflicto, la especificación guardada prevalecerá sobre la cadena de conexión. Por ese motivo, es mejor usar un conjunto mínimo de parámetros necesarios para conectarse con éxito a un archivo de texto y dejar que las especificaciones guardadas hagan el trabajo de describir cómo leer el archivo de texto.
Conclusión
Aprendió una forma alternativa de describir la estructura del archivo de texto sin usar un archivo externo. Vimos cómo Access utiliza dos tablas del sistema para almacenar las especificaciones. Por último, también aprendió cómo especificar las especificaciones guardadas usando el DSN
parámetro. En este punto, hemos cubierto todo lo que necesitamos saber sobre cómo vincular o abrir archivos de texto en Access. En el próximo artículo, juntaremos la información aprendida en el resto de la serie. También veremos el uso de las cadenas de conexión en las consultas de Access para un enfoque sin código.