private static string GetOleDbConnectionString(string fileNameOrConnectionString)
        {
            if (JetStoreDatabaseHandling.IsConnectionString(fileNameOrConnectionString) &&
                JetConnection.GetDataAccessProviderType(fileNameOrConnectionString) == DataAccessProviderType.OleDb)
            {
                return(fileNameOrConnectionString);
            }

            var filePath         = JetStoreDatabaseHandling.ExpandFileName(JetStoreDatabaseHandling.ExtractFileNameFromConnectionString(fileNameOrConnectionString));
            var connectionString = JetConnection.GetConnectionString(filePath, DataAccessProviderType.OleDb);

            if (JetStoreDatabaseHandling.IsConnectionString(fileNameOrConnectionString) &&
                JetConnection.GetDataAccessProviderType(fileNameOrConnectionString) == DataAccessProviderType.Odbc)
            {
                var oldCsb = new DbConnectionStringBuilder(true)
                {
                    ConnectionString = fileNameOrConnectionString
                };
                var newCsb = new DbConnectionStringBuilder {
                    ConnectionString = connectionString
                };

                newCsb.SetUserId(oldCsb.GetUserId(DataAccessProviderType.Odbc), DataAccessProviderType.OleDb);
                newCsb.SetPassword(oldCsb.GetPassword(DataAccessProviderType.Odbc), DataAccessProviderType.OleDb);
                newCsb.SetSystemDatabase(oldCsb.GetSystemDatabase(DataAccessProviderType.Odbc), DataAccessProviderType.OleDb);
                newCsb.SetDatabasePassword(oldCsb.GetDatabasePassword(DataAccessProviderType.Odbc), DataAccessProviderType.OleDb);

                connectionString = newCsb.ConnectionString;
            }

            return(connectionString);
        }
        private static string GetConnectionString(string filePath, DatabaseVersion version, CollatingOrder collatingOrder, string databasePassword)
        {
            var connectionString = JetConnection.GetConnectionString(filePath, DataAccessProviderType.OleDb);

            var databaseType = version switch
            {
                DatabaseVersion.Version10 => 1,
                DatabaseVersion.Version11 => 2,
                DatabaseVersion.Version20 => 3,
                DatabaseVersion.Version30 => 5,
                DatabaseVersion.Version40 => 5,
                DatabaseVersion.Version120 => 6,
                _ => 0
            };

            if (collatingOrder > 0)
            {
                //connectionString += $";Locale Identifier={collatingOrder}";
            }

            if (databaseType > 0)
            {
                connectionString += $";Jet OLEDB:Engine Type={databaseType}";
            }

            if (!string.IsNullOrEmpty(databasePassword))
            {
                connectionString += $";Jet OLEDB:Database Password={databasePassword}";
            }

            return(connectionString);
        }
        public static string CreateEmptyDatabase(string fileNameOrConnectionString /*, DbProviderFactory dataAccessProviderFactory*/)
        {
            var fileName = JetStoreDatabaseHandling.ExpandFileName(JetStoreDatabaseHandling.ExtractFileNameFromConnectionString(fileNameOrConnectionString));

            string connectionString = null;

            using var catalog = GetCatalogInstance();

            try
            {
                // ADOX is an ADO eXtension and ADO is build on top of OLE DB. We always need to use an OLE DB
                // connection string for ADOX.
                connectionString = JetConnection.GetConnectionString(fileName, DataAccessProviderType.OleDb);

                using var connection = catalog.Create(connectionString);
                //.Dispose(); // Dispose the returned Connection object, because we don't use it here.
                int recordsAffected;
                connection.Execute("CREATE TABLE `#Dual` (`ID` COUNTER CONSTRAINT `PrimaryKey` PRIMARY KEY)", out recordsAffected, /*adCmdText*/ 0x1 | /*adExecuteNoRecords*/ 0x80);
                connection.Execute("INSERT INTO `#Dual` (`ID`) VALUES (1)", out recordsAffected, /*adCmdText*/ 0x1 | /*adExecuteNoRecords*/ 0x80);
                connection.Execute("ALTER TABLE `#Dual` ADD CONSTRAINT `SingleRecord` CHECK (`ID` = 1)", out recordsAffected, /*adCmdText*/ 0x1 | /*adExecuteNoRecords*/ 0x80);
            }
            catch (Exception e)
            {
                throw new Exception($"Cannot create database \"{fileName}\" using ADOX with the following connection string: " + connectionString, e);
            }

            // try
            // {

            /*
             * connectionString = JetConnection.GetConnectionString(fileName, dataAccessProviderFactory);
             *
             * using var connection = (JetConnection)JetFactory.Instance.CreateConnection();
             * connection.ConnectionString = connectionString;
             * connection.DataAccessProviderFactory = dataAccessProviderFactory;
             * connection.Open();
             *
             * var script = @"CREATE TABLE `MSysAccessStorage` (
             * `DateCreate` DATETIME NULL,
             * `DateUpdate` DATETIME NULL,
             * `Id` COUNTER NOT NULL,
             * `Lv` IMAGE,
             * `Name` VARCHAR(128) NULL,
             * `ParentId` INT NULL,
             * `Type` INT NULL,
             * CONSTRAINT `Id` PRIMARY KEY (`Id`)
             * );
             * CREATE UNIQUE INDEX `ParentIdId` ON `MSysAccessStorage` (`ParentId`, `Id`);
             * CREATE UNIQUE INDEX `ParentIdName` ON `MSysAccessStorage` (`ParentId`, `Name`);";
             *
             * foreach (var commandText in script.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
             * {
             *  using var command = connection.CreateCommand(commandText);
             *  command.ExecuteNonQuery();
             * }*/
            //
            //
            // }
            // catch (Exception e)
            // {
            //     throw new Exception($"Cannot setup the newly created database \"{fileName}\" using {Enum.GetName(typeof(DataAccessProviderType), JetConnection.GetDataAccessProviderType(dataAccessProviderFactory))} with the following connection string: " + connectionString, e);
            // }
            //
            // try
            // {
            //     using var connection = catalog.ActiveConnection;
            //     connection.Close();
            // }
            // catch (Exception e)
            // {
            //     Diagnostics.Debug.WriteLine("Cannot close active connection after create statement.\r\nThe exception is: {0}", e.Message);
            // }

            return(connectionString);
        }