Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions src/System.Data.Jet/AdoxSchema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,15 @@ private static string GetOleDbConnectionString(string fileNameOrConnectionString
if (JetStoreDatabaseHandling.IsConnectionString(fileNameOrConnectionString) &&
JetConnection.GetDataAccessProviderType(fileNameOrConnectionString) == DataAccessProviderType.Odbc)
{
var oldCbs = new DbConnectionStringBuilder(true) {ConnectionString = fileNameOrConnectionString};
var newCbs = new DbConnectionStringBuilder {ConnectionString = connectionString};
var oldCsb = new DbConnectionStringBuilder(true) {ConnectionString = fileNameOrConnectionString};
var newCsb = new DbConnectionStringBuilder {ConnectionString = connectionString};

newCbs.SetUserId(oldCbs.GetUserId(DataAccessProviderType.Odbc), DataAccessProviderType.Odbc);
newCbs.SetPassword(oldCbs.GetPassword(DataAccessProviderType.Odbc), DataAccessProviderType.Odbc);
newCbs.SetSystemDatabase(oldCbs.GetSystemDatabase(DataAccessProviderType.Odbc), DataAccessProviderType.Odbc);
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 = newCbs.ConnectionString;
connectionString = newCsb.ConnectionString;
}

return connectionString;
Expand Down Expand Up @@ -706,6 +707,7 @@ protected static Dictionary<string, object> GetProperties(dynamic properties)

public override void Dispose()
{
_connection.Dispose();
_catalog.Dispose();
}

Expand Down
11 changes: 9 additions & 2 deletions src/System.Data.Jet/DaoSchema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,24 @@ public DaoSchema(JetConnection connection)
var userId = csb.GetUserId();
var password = csb.GetPassword();
var systemDatabase = csb.GetSystemDatabase();
var databasePassword = csb.GetDatabasePassword();

if (!string.IsNullOrEmpty(systemDatabase))
{
_dbEngine.SystemDB = systemDatabase;
}

_workspace = _dbEngine.CreateWorkspace(string.Empty, userId ?? "admin", password ?? string.Empty, /*WorkspaceTypeEnum.dbUseJet*/ 2);
_workspace = _dbEngine.CreateWorkspace(string.Empty, userId ?? "Admin", password ?? string.Empty, /*WorkspaceTypeEnum.dbUseJet*/ 2);

try
{
_database = _workspace.OpenDatabase(dataSource, /* Exclusive */ false, /* ReadOnly */ true, string.Empty);
_database = _workspace.OpenDatabase(
dataSource,
/* Exclusive */ false,
/* ReadOnly */ true,
"MS Access" + (string.IsNullOrEmpty(databasePassword)
? null
: $";PWD={databasePassword}"));
}
catch
{
Expand Down
157 changes: 108 additions & 49 deletions src/System.Data.Jet/DbConnectionStringBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,81 +8,81 @@ public static class DbConnectionStringBuilderExtensions
{
public static string GetProvider(this DbConnectionStringBuilder builder, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
return builder.TryGetValue("provider", out var value)
return builder.TryGetValue("Provider", out var value)
? (string)value
: null;
}

if (providerType != null && providerType == DataAccessProviderType.Odbc ||
if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
return builder.TryGetValue("driver", out var value)
return builder.TryGetValue("DRIVER", out var value)
? (string)value
: null;
}

return builder.TryGetValue("provider", out var oleDbValue)
return builder.TryGetValue("Provider", out var oleDbValue)
? (string)oleDbValue
: builder.TryGetValue("driver", out var odbcValue)
: builder.TryGetValue("DRIVER", out var odbcValue)
? (string)odbcValue
: null;
}

public static void SetProvider(this DbConnectionStringBuilder builder, string value, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
builder["provider"] = value;
builder["Provider"] = value;
}
else if (providerType != null && providerType == DataAccessProviderType.Odbc ||
else if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
builder["driver"] = Regex.Replace(value.Trim(), @"^(?<!\{)(.*)(?!\})$", @"{$1}", RegexOptions.IgnoreCase);
builder["DRIVER"] = Regex.Replace(value.Trim(), @"^(?<!\{)(.*)(?!\})$", @"{$1}", RegexOptions.IgnoreCase);
}
else
throw new InvalidOperationException("This extension method only supports OdbcConnectionStringBuilder and OleDbConnectionStringBuilder.");
}

public static string GetDataSource(this DbConnectionStringBuilder builder, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
return builder.TryGetValue("data source", out var value)
return builder.TryGetValue("Data Source", out var value)
? (string)value
: null;
}

if (providerType != null && providerType == DataAccessProviderType.Odbc ||
if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
return builder.TryGetValue("dbq", out var value)
return builder.TryGetValue("DBQ", out var value)
? (string)value
: null;
}

return builder.TryGetValue("data source", out var oleDbValue)
return builder.TryGetValue("Data Source", out var oleDbValue)
? (string)oleDbValue
: builder.TryGetValue("dbq", out var odbcValue)
: builder.TryGetValue("DBQ", out var odbcValue)
? (string)odbcValue
: null;
}

public static void SetDataSource(this DbConnectionStringBuilder builder, string value, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
builder["data source"] = value;
builder["Data Source"] = value;
}
else if (providerType != null && providerType == DataAccessProviderType.Odbc ||
else if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
builder["dbq"] = value;
builder["DBQ"] = value;
}
else
throw new InvalidOperationException("This extension method only supports OdbcConnectionStringBuilder and OleDbConnectionStringBuilder.");
Expand All @@ -92,119 +92,178 @@ public static string GetUserId(this DbConnectionStringBuilder builder, DataAcces
{
if (IsOleDb(builder))
{
return builder.TryGetValue("user id", out var value)
return builder.TryGetValue("User ID", out var value)
? (string)value
: null;
}

if (providerType != null && providerType == DataAccessProviderType.Odbc ||
if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
return builder.TryGetValue("uid", out var value)
return builder.TryGetValue("UID", out var value)
? (string)value
: null;
}

return builder.TryGetValue("user id", out var oleDbValue)
return builder.TryGetValue("User ID", out var oleDbValue)
? (string)oleDbValue
: builder.TryGetValue("uid", out var odbcValue)
: builder.TryGetValue("UID", out var odbcValue)
? (string)odbcValue
: null;
}

public static void SetUserId(this DbConnectionStringBuilder builder, string value, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
builder["user id"] = value;
builder["User ID"] = value;
}
else if (providerType != null && providerType == DataAccessProviderType.Odbc ||
else if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
builder["uid"] = value;
builder["UID"] = value;
}
else
throw new InvalidOperationException("This extension method only supports OdbcConnectionStringBuilder and OleDbConnectionStringBuilder.");
}

public static string GetPassword(this DbConnectionStringBuilder builder, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
return builder.TryGetValue("password", out var value)
return builder.TryGetValue("Password", out var value)
? (string)value
: null;
}

if (providerType != null && providerType == DataAccessProviderType.Odbc ||
// MAJOR ISSUE: PWD seems to be used for the datbase password AND the workgroup user password.
// See https://stackoverflow.com/questions/65025810/how-to-specify-mdw-username-and-password-user-level-security-and-the-database
// As a workaround, we will assume the PWD field to contain the database password, if no SYSTEMDB has been specified.
// Otherwise, we will handle the field as the workgroup user password.

if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
return builder.TryGetValue("pwd", out var value)
? (string)value
return !string.IsNullOrEmpty(builder.GetSystemDatabase(providerType))
? builder.TryGetValue("PWD", out var value)
? (string) value
: null
: null;
}

return builder.TryGetValue("password", out var oleDbValue)
? (string)oleDbValue
: builder.TryGetValue("pwd", out var odbcValue)
? (string)odbcValue
return builder.TryGetValue("Password", out var oleDbValue)
? (string) oleDbValue
: !string.IsNullOrEmpty(builder.GetSystemDatabase(providerType))
? builder.TryGetValue("PWD", out var odbcValue)
? (string) odbcValue
: null
: null;
}

public static void SetPassword(this DbConnectionStringBuilder builder, string value, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
builder["password"] = value;
builder["Password"] = value;
}
else if (providerType != null && providerType == DataAccessProviderType.Odbc ||
else if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
builder["pwd"] = value;
builder["PWD"] = value;
}
else
throw new InvalidOperationException("This extension method only supports OdbcConnectionStringBuilder and OleDbConnectionStringBuilder.");
}

public static string GetSystemDatabase(this DbConnectionStringBuilder builder, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
return builder.TryGetValue("Jet OLEDB:System Database", out var value)
? (string)value
: null;
}

if (providerType != null && providerType == DataAccessProviderType.Odbc ||
if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
return builder.TryGetValue("SystemDB", out var value)
return builder.TryGetValue("SYSTEMDB", out var value)
? (string)value
: null;
}

return builder.TryGetValue("Jet OLEDB:System Database", out var oleDbValue)
? (string)oleDbValue
: builder.TryGetValue("SystemDB", out var odbcValue)
: builder.TryGetValue("SYSTEMDB", out var odbcValue)
? (string)odbcValue
: null;
}

public static void SetSystemDatabase(this DbConnectionStringBuilder builder, string value, DataAccessProviderType? providerType = null)
{
if (providerType != null && providerType == DataAccessProviderType.OleDb ||
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
builder["Jet OLEDB:System Database"] = value;
}
else if (providerType != null && providerType == DataAccessProviderType.Odbc ||
else if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
builder["SYSTEMDB"] = value;
}
else
throw new InvalidOperationException("This extension method only supports OdbcConnectionStringBuilder and OleDbConnectionStringBuilder.");
}

public static string GetDatabasePassword(this DbConnectionStringBuilder builder, DataAccessProviderType? providerType = null)
{
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
return builder.TryGetValue("Jet OLEDB:Database Password", out var value)
? (string)value
: null;
}

// MAJOR ISSUE: PWD seems to be used for the datbase password AND the workgroup user password.
// See https://stackoverflow.com/questions/65025810/how-to-specify-mdw-username-and-password-user-level-security-and-the-database
// As a workaround, we will assume the PWD field to contain the database password, if no SYSTEMDB has been specified.
// Otherwise, we will handle the field as the workgroup user password.

if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
return string.IsNullOrEmpty(builder.GetSystemDatabase(providerType))
? builder.TryGetValue("PWD", out var value)
? (string) value
: null
: null;
}

return builder.TryGetValue("Jet OLEDB:Database Password", out var oleDbValue)
? (string) oleDbValue
: string.IsNullOrEmpty(builder.GetSystemDatabase(providerType))
? builder.TryGetValue("PWD", out var odbcValue)
? (string) odbcValue
: null
: null;
}

public static void SetDatabasePassword(this DbConnectionStringBuilder builder, string value, DataAccessProviderType? providerType = null)
{
if (providerType == DataAccessProviderType.OleDb ||
IsOleDb(builder))
{
builder["Jet OLEDB:Database Password"] = value;
}
else if (providerType == DataAccessProviderType.Odbc ||
IsOdbc(builder))
{
builder["SystemDB"] = value;
builder["PWD"] = value;
}
else
throw new InvalidOperationException("This extension method only supports OdbcConnectionStringBuilder and OleDbConnectionStringBuilder.");
Expand Down