public override DataTable GetColumns()
        {
            var dataTable = SchemaTables.GetColumnsDataTable();

            // There is no way to get the scale of a decimal with DAO. Looks like someone at Microsoft just forgot to
            // implement it.
            // Therefore, either ADO has to be used, or DAO together with the GetSchema()
            // method (that contains precision and scale, but no default value when using ODBC, because again, looks
            // like someone at Microsoft just forgot to implement it).
            Dictionary <(string TableName, string ColumnName), int?> numericScales = null;

            if (!_naturalOnly)
            {
                var schemaTable = _connection.InnerConnection.GetSchema("Columns");
                numericScales = schemaTable.Rows
                                .Cast <DataRow>()
                                .ToDictionary(
                    t => (TableName: (string)t["TABLE_NAME"], ColumnName: (string)t["COLUMN_NAME"]),
                    t => t.Table.Columns.Contains("DECIMAL_DIGITS")
                            ? t["DECIMAL_DIGITS"] != DBNull.Value
                                ? (int?)(short?)t["DECIMAL_DIGITS"]
                                : null
                            : t["NUMERIC_SCALE"] != DBNull.Value
                                ? (int?)(short?)t["NUMERIC_SCALE"]
                                : null);
            }

            var objectDefsCollection = new[]
        public override DataTable GetColumns()
        {
            var dataTable = SchemaTables.GetColumnsDataTable();

            // There is no way to get the ordinal position of a column with ADOX. Looks like someone at Microsoft just forgot to
            // implement it.
            // Therefore, either DAO has to be used, or ADOX together with the OpenSchema()
            // method.

            Dictionary <(string TableName, string ColumnName), int> ordinalPositions = null;

            if (!_naturalOnly)
            {
                using (var recordset = _connection.OpenSchema(SchemaEnum.adSchemaColumns))
                {
                    ordinalPositions = new Dictionary <(string TableName, string ColumnName), int>();

                    using var fields               = recordset.Fields;
                    using var tableNameField       = fields["TABLE_NAME"];
                    using var columnNameField      = fields["COLUMN_NAME"];
                    using var ordinalPositionField = fields["ORDINAL_POSITION"];

                    recordset.MoveFirst();

                    while (!recordset.EOF)
                    {
                        var tableName       = (string)tableNameField.Value;
                        var columnName      = (string)columnNameField.Value;
                        var ordinalPosition = (int)ordinalPositionField.Value - 1;

                        ordinalPositions.Add((tableName, columnName), ordinalPosition);
                        recordset.MoveNext();
                    }

                    recordset.Close();
                }
            }

            using var tables = _catalog.Tables;
            var tableCount = tables.Count;

            for (var i = 0; i < tableCount; i++)
            {
                using var table = tables[i];
                var tableName = (string)table.Name;

                using var columns = table.Columns;
                var columnCount = columns.Count;

                for (var j = 0; j < columnCount; j++)
                {
                    using var column     = columns[j];
                    using var properties = column.Properties;

                    var columnName      = (string)column.Name;
                    var attributes      = (ColumnAttributesEnum)column.Attributes;
                    var ordinalPosition = ordinalPositions?[(tableName, columnName)] ?? j;