diff --git a/src/EFCore.Jet.Data/JetCommandParser.cs b/src/EFCore.Jet.Data/JetCommandParser.cs index 6003001..d0b02b5 100644 --- a/src/EFCore.Jet.Data/JetCommandParser.cs +++ b/src/EFCore.Jet.Data/JetCommandParser.cs @@ -18,37 +18,7 @@ namespace EntityFrameworkCore.Jet.Data } public IReadOnlyList GetStateIndices(char state, int start = 0, int length = -1) - { - if (start < 0 || - start >= States.Length) - { - throw new ArgumentOutOfRangeException(nameof(start)); - } - - if (length < 0 || - length > 0 && start + length > States.Length) - { - length = States.Length - start; - } - - var stateIndices = new List(); - char? lastState = null; - - for (var i = start; i < length; i++) - { - var currentState = States[i]; - - if (currentState == state && - currentState != lastState) - { - stateIndices.Add(i); - } - - lastState = currentState; - } - - return stateIndices.AsReadOnly(); - } + => GetStateIndices(new[] {state}, start, length); public IReadOnlyList GetStateIndices(char[] states, int start = 0, int length = -1) { @@ -77,7 +47,7 @@ namespace EntityFrameworkCore.Jet.Data var stateIndices = new List(); char? lastState = null; - for (var i = start; i < length; i++) + for (var i = start; i < start + length; i++) { var currentState = States[i]; diff --git a/src/EFCore.Jet.Data/JetConnection.cs b/src/EFCore.Jet.Data/JetConnection.cs index 19e1379..ca51728 100644 --- a/src/EFCore.Jet.Data/JetConnection.cs +++ b/src/EFCore.Jet.Data/JetConnection.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.ComponentModel.Design; using System.Data; using System.Data.Common; using EntityFrameworkCore.Jet.Data.JetStoreSchemaDefinition; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text.RegularExpressions; using Microsoft.Win32; @@ -382,7 +384,7 @@ namespace EntityFrameworkCore.Jet.Data } } - connectionString = ExpandDatabaseFilePath(connectionString); + connectionString = ExpandDatabaseFilePath(connectionString, DataAccessProviderFactory); try { @@ -561,11 +563,17 @@ namespace EntityFrameworkCore.Jet.Data } public static string GetConnectionString(string fileNameOrConnectionString, DbProviderFactory dataAccessProviderFactory) - => GetConnectionString(fileNameOrConnectionString, GetDataAccessProviderType(dataAccessProviderFactory)); + => GetConnectionString(fileNameOrConnectionString, GetDataAccessProviderType(dataAccessProviderFactory), dataAccessProviderFactory); - public static string GetConnectionString(string fileNameOrConnectionString, DataAccessProviderType dataAccessProviderType) + public static string GetConnectionString(string fileNameOrConnectionString, DataAccessProviderType? dataAccessProviderType = null) + { + var providerType = dataAccessProviderType ?? JetConfiguration.DefaultDataAccessProviderType; + return GetConnectionString(fileNameOrConnectionString, providerType, JetFactory.Instance.GetDataAccessProviderFactory(providerType)); + } + + internal static string GetConnectionString(string fileNameOrConnectionString, DataAccessProviderType dataAccessProviderType, DbProviderFactory dataAccessProviderFactory) => IsConnectionString(fileNameOrConnectionString) - ? fileNameOrConnectionString + ? ExpandDatabaseFilePath(fileNameOrConnectionString, dataAccessProviderFactory) : GetConnectionString( GetMostRecentCompatibleProviders(dataAccessProviderType).First().Key, fileNameOrConnectionString, @@ -576,12 +584,12 @@ namespace EntityFrameworkCore.Jet.Data public static string GetConnectionString(string provider, string fileName, DataAccessProviderType dataAccessProviderType) => dataAccessProviderType == DataAccessProviderType.OleDb - ? $"Provider={provider};Data Source={fileName}" - : $"Driver={{{provider}}};DBQ={fileName}"; + ? $"Provider={provider};Data Source={JetStoreDatabaseHandling.ExpandFileName(fileName)}" + : $"Driver={{{provider}}};DBQ={JetStoreDatabaseHandling.ExpandFileName(fileName)}"; - private string ExpandDatabaseFilePath(string connectionString) + private static string ExpandDatabaseFilePath(string connectionString, DbProviderFactory dataAccessProviderFactory) { - var connectionStringBuilder = JetFactory.InnerFactory.CreateConnectionStringBuilder(); + var connectionStringBuilder = dataAccessProviderFactory.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = connectionString; connectionStringBuilder.SetDataSource(JetStoreDatabaseHandling.ExpandFileName(connectionStringBuilder.GetDataSource())); diff --git a/src/EFCore.Jet/Storage/Internal/JetDatabaseCreator.cs b/src/EFCore.Jet/Storage/Internal/JetDatabaseCreator.cs index ad1f01e..f5bd621 100644 --- a/src/EFCore.Jet/Storage/Internal/JetDatabaseCreator.cs +++ b/src/EFCore.Jet/Storage/Internal/JetDatabaseCreator.cs @@ -107,8 +107,11 @@ namespace EntityFrameworkCore.Jet.Storage.Internal // var dataSource = _relationalConnection.DbConnection.DataSource; var connection = (JetConnection) _relationalConnection.DbConnection; + var fileNameOrConnectionString = connection.ConnectionString; + var connectionString = JetConnection.GetConnectionString(fileNameOrConnectionString, connection.DataAccessProviderFactory); + var csb = connection.JetFactory.CreateConnectionStringBuilder(); - csb.ConnectionString = connection.ConnectionString; + csb.ConnectionString = connectionString; var dataSource = csb.GetDataSource(); var databasePassword = csb.GetDatabasePassword();