Christopher Jolly 3 years ago
commit 6230db2803

@ -15,6 +15,12 @@
<SignAssembly>true</SignAssembly> <SignAssembly>true</SignAssembly>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.Versioning.SupportedOSPlatform">
<_Parameter1>windows</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
<!-- TODO: Enable for 5.0 <!-- TODO: Enable for 5.0
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" PrivateAssets="All" /> <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" PrivateAssets="All" />

@ -21,14 +21,14 @@ namespace EntityFrameworkCore.Jet.Data
IsOdbc(builder)) IsOdbc(builder))
{ {
return builder.TryGetValue("DRIVER", out var value) return builder.TryGetValue("DRIVER", out var value)
? (string)value ? ((string)value).TrimStart('{').TrimEnd('}')
: null; : null;
} }
return builder.TryGetValue("Provider", out var oleDbValue) return builder.TryGetValue("Provider", out var oleDbValue)
? (string)oleDbValue ? (string)oleDbValue
: builder.TryGetValue("DRIVER", out var odbcValue) : builder.TryGetValue("DRIVER", out var odbcValue)
? (string)odbcValue ? ((string)odbcValue).TrimStart('{').TrimEnd('}')
: null; : null;
} }

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<Description>Jet/ACE data provider for .NET used by EntityFramworkCore.Jet (Microsoft Access MDB/ACCDB files).</Description> <Description>Jet/ACE data provider for .NET used by EntityFramworkCore.Jet (Microsoft Access MDB/ACCDB files).</Description>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<Platforms>AnyCPU;x86;x64</Platforms> <Platforms>AnyCPU;x86;x64</Platforms>
<AssemblyName>EntityFrameworkCore.Jet.Data</AssemblyName> <AssemblyName>EntityFrameworkCore.Jet.Data</AssemblyName>
<RootNamespace>EntityFrameworkCore.Jet.Data</RootNamespace> <RootNamespace>EntityFrameworkCore.Jet.Data</RootNamespace>

@ -0,0 +1,88 @@
using System;
using System.Data.Common;
namespace EntityFrameworkCore.Jet.Data
{
public class JetConnectionStringBuilder : DbConnectionStringBuilder
{
private readonly DbConnectionStringBuilder _innerBuilder;
public JetConnectionStringBuilder() : this(JetConfiguration.DefaultDataAccessProviderType)
{
}
public JetConnectionStringBuilder(DataAccessProviderType providerType)
{
ProviderType = providerType;
_innerBuilder = this;
}
internal JetConnectionStringBuilder(DbProviderFactory innerFactory)
{
ProviderType = JetConnection.GetDataAccessProviderType(innerFactory);
_innerBuilder = innerFactory.CreateConnectionStringBuilder() ?? throw new InvalidOperationException($"CreateConnectionStringBuilder() returned null for {innerFactory}");
}
public DataAccessProviderType ProviderType { get; }
public string? Provider
{
get => _innerBuilder.GetProvider(ProviderType);
set
{
_innerBuilder.SetProvider(value!, ProviderType);
ConnectionString = _innerBuilder.ConnectionString;
}
}
public string? DataSource
{
get => _innerBuilder.GetDataSource(ProviderType);
set
{
_innerBuilder.SetDataSource(value!, ProviderType);
ConnectionString = _innerBuilder.ConnectionString;
}
}
public string? UserId
{
get => _innerBuilder.GetUserId(ProviderType);
set
{
_innerBuilder.SetUserId(value!, ProviderType);
ConnectionString = _innerBuilder.ConnectionString;
}
}
public string? Password
{
get => _innerBuilder.GetPassword(ProviderType);
set
{
_innerBuilder.SetPassword(value!, ProviderType);
ConnectionString = _innerBuilder.ConnectionString;
}
}
public string? SystemDatabase
{
get => _innerBuilder.GetSystemDatabase(ProviderType);
set
{
_innerBuilder.SetSystemDatabase(value!, ProviderType);
ConnectionString = _innerBuilder.ConnectionString;
}
}
public string? DatabasePassword
{
get => _innerBuilder.GetDatabasePassword(ProviderType);
set
{
_innerBuilder.SetDatabasePassword(value!, ProviderType);
ConnectionString = _innerBuilder.ConnectionString;
}
}
}
}

@ -82,7 +82,7 @@ namespace EntityFrameworkCore.Jet.Data
public override DbConnectionStringBuilder CreateConnectionStringBuilder() public override DbConnectionStringBuilder CreateConnectionStringBuilder()
=> InnerFactory == null => InnerFactory == null
? throw new InvalidOperationException(Messages.CannotCallJetProviderFactoryMethodOnSingletonInstance(nameof(CreateConnectionStringBuilder))) ? throw new InvalidOperationException(Messages.CannotCallJetProviderFactoryMethodOnSingletonInstance(nameof(CreateConnectionStringBuilder)))
: InnerFactory.CreateConnectionStringBuilder(); : new JetConnectionStringBuilder(InnerFactory);
/// <summary> /// <summary>
/// Returns a new instance of the provider's class that implements the <see cref="T:System.Data.Common.DbDataAdapter" /> class. /// Returns a new instance of the provider's class that implements the <see cref="T:System.Data.Common.DbDataAdapter" /> class.

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<Description>Explicit ODBC support for Jet/ACE database provider for Entity Framework Core (Microsoft Access MDB/ACCDB files).</Description> <Description>Explicit ODBC support for Jet/ACE database provider for Entity Framework Core (Microsoft Access MDB/ACCDB files).</Description>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<AssemblyName>EntityFrameworkCore.Jet.Odbc</AssemblyName> <AssemblyName>EntityFrameworkCore.Jet.Odbc</AssemblyName>
<RootNamespace>EntityFrameworkCore.Jet</RootNamespace> <RootNamespace>EntityFrameworkCore.Jet</RootNamespace>
<PackageTags>$(PackageTags);ODBC;System.Data.Odbc</PackageTags> <PackageTags>$(PackageTags);ODBC;System.Data.Odbc</PackageTags>

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<Description>Explicit OLE DB support for Jet/ACE database provider for Entity Framework Core (Microsoft Access MDB/ACCDB files).</Description> <Description>Explicit OLE DB support for Jet/ACE database provider for Entity Framework Core (Microsoft Access MDB/ACCDB files).</Description>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<AssemblyName>EntityFrameworkCore.Jet.OleDb</AssemblyName> <AssemblyName>EntityFrameworkCore.Jet.OleDb</AssemblyName>
<RootNamespace>EntityFrameworkCore.Jet</RootNamespace> <RootNamespace>EntityFrameworkCore.Jet</RootNamespace>
<PackageTags>$(PackageTags);OLE DB;OLEDB;System.Data.OleDb</PackageTags> <PackageTags>$(PackageTags);OLE DB;OLEDB;System.Data.OleDb</PackageTags>

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<Description>Jet/ACE database provider for Entity Framework Core (Microsoft Access MDB/ACCDB files).</Description> <Description>Jet/ACE database provider for Entity Framework Core (Microsoft Access MDB/ACCDB files).</Description>
<TargetFramework>net6.0-windows</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<RootNamespace>EntityFrameworkCore.Jet</RootNamespace> <RootNamespace>EntityFrameworkCore.Jet</RootNamespace>
<AssemblyName>EntityFrameworkCore.Jet</AssemblyName> <AssemblyName>EntityFrameworkCore.Jet</AssemblyName>
<Platforms>AnyCPU;x86;x64</Platforms> <Platforms>AnyCPU;x86;x64</Platforms>

@ -1,4 +1,5 @@
using System.Data.Odbc; using System.Data.Odbc;
using System.Data.OleDb;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace EntityFrameworkCore.Jet.Data.Tests namespace EntityFrameworkCore.Jet.Data.Tests
@ -6,42 +7,128 @@ namespace EntityFrameworkCore.Jet.Data.Tests
[TestClass] [TestClass]
public class ConnectionStringTest public class ConnectionStringTest
{ {
[TestMethod] [DataTestMethod]
public void Escape_double_quoted_connection_string() [DataRow(DataAccessProviderType.Odbc)]
[DataRow(DataAccessProviderType.OleDb)]
public void Escape_double_quoted_connection_string(DataAccessProviderType providerType)
{ {
var expectedDatabaseName = "Joe's \"Recipes\" Database.accdb"; var expectedDatabaseName = "Joe's \"Recipes\" Database.accdb";
var escapedDatabaseName = expectedDatabaseName.Replace("\"", "\"\""); var escapedDatabaseName = expectedDatabaseName.Replace("\"", "\"\"");
var connectionString = Helpers.DataAccessProviderFactory is OdbcFactory var connectionString = providerType == DataAccessProviderType.Odbc
? $"DBQ=\"{escapedDatabaseName}\"" ? $"DBQ=\"{escapedDatabaseName}\""
: $"Data Source=\"{escapedDatabaseName}\""; : $"Data Source=\"{escapedDatabaseName}\"";
var csb = Helpers.DataAccessProviderFactory.CreateConnectionStringBuilder(); var csb = new JetConnectionStringBuilder(providerType) { ConnectionString = connectionString };
csb.ConnectionString = connectionString;
Assert.AreEqual(expectedDatabaseName, csb.DataSource);
var actualDatabaseName = csb.GetDataSource();
Assert.AreEqual(expectedDatabaseName, actualDatabaseName);
} }
[TestMethod] [DataTestMethod]
public void Escape_single_quoted_connection_string() [DataRow(DataAccessProviderType.Odbc)]
[DataRow(DataAccessProviderType.OleDb)]
public void Escape_single_quoted_connection_string(DataAccessProviderType providerType)
{ {
var expectedDatabaseName = "Joe's \"Recipes\" Database.accdb"; var expectedDatabaseName = "Joe's \"Recipes\" Database.accdb";
var escapedDatabaseName = expectedDatabaseName.Replace("'", "''"); var escapedDatabaseName = expectedDatabaseName.Replace("'", "''");
var connectionString = Helpers.DataAccessProviderFactory is OdbcFactory var connectionString = providerType == DataAccessProviderType.Odbc
? $"DBQ='{escapedDatabaseName}'" ? $"DBQ='{escapedDatabaseName}'"
: $"Data Source='{escapedDatabaseName}'"; : $"Data Source='{escapedDatabaseName}'";
using var connection = new JetConnection(connectionString, Helpers.DataAccessProviderFactory); var csb = new JetConnectionStringBuilder(providerType) { ConnectionString = connectionString };
var csb = Helpers.DataAccessProviderFactory.CreateConnectionStringBuilder(); Assert.AreEqual(expectedDatabaseName, csb.DataSource);
csb.ConnectionString = connectionString; }
var actualDatabaseName = csb.GetDataSource(); [TestMethod]
public void Odbc_read_connection_string_with_all_properties()
Assert.AreEqual(expectedDatabaseName, actualDatabaseName); {
const string connectionString = @"driver={Microsoft Access Driver (*.mdb, *.accdb)};dbq=C:\myFolder\myAccessFile.accdb;uid=Admin;pwd=hunter2;systemdb=SysDb";
var csb = new JetConnectionStringBuilder(DataAccessProviderType.Odbc) { ConnectionString = connectionString };
Assert.AreEqual(csb.Provider, @"Microsoft Access Driver (*.mdb, *.accdb)");
Assert.AreEqual(csb.DataSource, @"C:\myFolder\myAccessFile.accdb");
Assert.AreEqual(csb.UserId, "Admin");
Assert.AreEqual(csb.Password, "hunter2");
Assert.AreEqual(csb.SystemDatabase, "SysDb");
Assert.IsNull(csb.DatabasePassword);
}
[TestMethod]
public void Odbc_connection_string_with_all_properties()
{
var csb = new JetConnectionStringBuilder(DataAccessProviderType.Odbc)
{
Provider = "Microsoft Access Driver (*.mdb, *.accdb)",
DataSource = @"C:\myFolder\myAccessFile.accdb",
UserId = "Admin",
Password = "hunter2",
SystemDatabase = "SysDb",
DatabasePassword = "DbPwd",
};
Assert.AreEqual(@"driver=""{Microsoft Access Driver (*.mdb, *.accdb)}"";dbq=C:\myFolder\myAccessFile.accdb;uid=Admin;pwd=DbPwd;systemdb=SysDb", csb.ConnectionString);
}
[TestMethod]
public void Odbc_connection_string_with_all_properties_from_factory()
{
var csb = new JetConnection(OdbcFactory.Instance).JetFactory.CreateConnectionStringBuilder() as JetConnectionStringBuilder;
Assert.IsNotNull(csb);
csb.Provider = "Microsoft Access Driver (*.mdb, *.accdb)";
csb.DataSource = @"C:\myFolder\myAccessFile.accdb";
csb.UserId = "Admin";
csb.Password = "hunter2";
csb.SystemDatabase = "SysDb";
csb.DatabasePassword = "DbPwd";
Assert.AreEqual(@"driver=""{Microsoft Access Driver (*.mdb, *.accdb)}"";dbq=C:\myFolder\myAccessFile.accdb;uid=Admin;pwd=DbPwd;systemdb=SysDb", csb.ConnectionString);
}
[TestMethod]
public void OleDb_read_connection_string_with_all_properties()
{
const string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccessFile.accdb;User ID=Admin;Password=hunter2;Jet OLEDB:System Database=SysDb;Jet OLEDB:Database Password=DbPwd";
var csb = new JetConnectionStringBuilder(DataAccessProviderType.OleDb) { ConnectionString = connectionString };
Assert.AreEqual(csb.Provider, "Microsoft.ACE.OLEDB.12.0");
Assert.AreEqual(csb.DataSource, @"C:\myFolder\myAccessFile.accdb");
Assert.AreEqual(csb.UserId, "Admin");
Assert.AreEqual(csb.Password, "hunter2");
Assert.AreEqual(csb.SystemDatabase, "SysDb");
Assert.AreEqual(csb.DatabasePassword, "DbPwd");
}
[TestMethod]
public void OleDb_connection_string_with_all_properties()
{
var csb = new JetConnectionStringBuilder(DataAccessProviderType.OleDb)
{
Provider = "Microsoft.ACE.OLEDB.12.0",
DataSource = @"C:\myFolder\myAccessFile.accdb",
UserId = "Admin",
Password = "hunter2",
SystemDatabase = "SysDb",
DatabasePassword = "DbPwd",
};
Assert.AreEqual(@"provider=Microsoft.ACE.OLEDB.12.0;data source=C:\myFolder\myAccessFile.accdb;user id=Admin;password=hunter2;jet oledb:system database=SysDb;jet oledb:database password=DbPwd", csb.ConnectionString);
}
[TestMethod]
public void OleDb_connection_string_with_all_properties_from_factory()
{
var csb = new JetConnection(OleDbFactory.Instance).JetFactory.CreateConnectionStringBuilder() as JetConnectionStringBuilder;
Assert.IsNotNull(csb);
csb.Provider = "Microsoft.ACE.OLEDB.12.0";
csb.DataSource = @"C:\myFolder\myAccessFile.accdb";
csb.UserId = "Admin";
csb.Password = "hunter2";
csb.SystemDatabase = "SysDb";
csb.DatabasePassword = "DbPwd";
Assert.AreEqual(@"provider=Microsoft.ACE.OLEDB.12.0;data source=C:\myFolder\myAccessFile.accdb;password=hunter2;user id=Admin;jet oledb:system database=SysDb;jet oledb:database password=DbPwd", csb.ConnectionString);
} }
} }
} }
Loading…
Cancel
Save