Fix create database operations and multi statement splitting with parameters (#97)

* Fix automatically assigned file extensions when creating databases.

* Fix parser to correctly return state indices of sub commands. This is a fix for commands containing more than one actual SQL command in its command text, when those multiple actual SQL commands are using parameters.
pull/101/head
Laurents Meyer 5 years ago committed by GitHub
parent 163cf317f4
commit fedc4cc226
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -18,37 +18,7 @@ namespace EntityFrameworkCore.Jet.Data
}
public IReadOnlyList<int> 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<int>();
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<int> GetStateIndices(char[] states, int start = 0, int length = -1)
{
@ -77,7 +47,7 @@ namespace EntityFrameworkCore.Jet.Data
var stateIndices = new List<int>();
char? lastState = null;
for (var i = start; i < length; i++)
for (var i = start; i < start + length; i++)
{
var currentState = States[i];

@ -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()));

@ -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();

Loading…
Cancel
Save