diff --git a/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj b/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj new file mode 100644 index 0000000..bbde65d --- /dev/null +++ b/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj @@ -0,0 +1,21 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + b7737b4f-4c59-4ce5-aa62-0a6cca639473 + ADO.ExecuteCommand.Core + .\obj + .\bin\ + v4.5 + + + + 2.0 + + + diff --git a/ADO.ExecuteCommand/Commands/Command.cs b/ADO.ExecuteCommand.Core/Commands/Command.cs similarity index 100% rename from ADO.ExecuteCommand/Commands/Command.cs rename to ADO.ExecuteCommand.Core/Commands/Command.cs diff --git a/ADO.ExecuteCommand/Commands/CommandBatch.cs b/ADO.ExecuteCommand.Core/Commands/CommandBatch.cs similarity index 100% rename from ADO.ExecuteCommand/Commands/CommandBatch.cs rename to ADO.ExecuteCommand.Core/Commands/CommandBatch.cs diff --git a/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs b/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs new file mode 100644 index 0000000..b13147d --- /dev/null +++ b/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs @@ -0,0 +1,34 @@ +using System; + +namespace ADO.ExecuteCommand.Helper +{ + public abstract partial class CommandHelper + { + #region - Factory - + + public static CommandHelper CreateHelper(DataAccessSectionSettings settings) + { + try + { + var providerType = settings.Type; + + var daType = Type.GetType(providerType); + if (daType == null) throw new NullReferenceException("Null Reference in Provider type configuration Session."); + + var provider = Activator.CreateInstance(daType, settings.ConnectionString); + if (provider is CommandHelper) + { + return provider as CommandHelper; + } + + throw new Exception("The provider specified does not extends the QueryRunner abstract class."); + } + catch (Exception e) + { + throw new Exception("If the section is not defined on the configuration file this method can't be used to create an QueryRunner instance.", e); + } + } + + #endregion + } +} diff --git a/ADO.ExecuteCommand/Helper/CommandHelper.cs b/ADO.ExecuteCommand.Core/Helper/CommandHelper.cs similarity index 60% rename from ADO.ExecuteCommand/Helper/CommandHelper.cs rename to ADO.ExecuteCommand.Core/Helper/CommandHelper.cs index a4ac2d9..f2a9d57 100644 --- a/ADO.ExecuteCommand/Helper/CommandHelper.cs +++ b/ADO.ExecuteCommand.Core/Helper/CommandHelper.cs @@ -1,60 +1,28 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.Configuration; using System.Data; using System.Linq; using ADO.ExecuteCommand.Commands; namespace ADO.ExecuteCommand.Helper { - public abstract class CommandHelper + public abstract partial class CommandHelper { #region Declare members - protected static Hashtable ParamCache = Hashtable.Synchronized(new Hashtable()); - protected static string ConnectionString; + protected string ConnectionString; #endregion + protected CommandHelper(string connectionString) + { + this.ConnectionString = connectionString; + } + #region Provider specific abstract methods public abstract IDbConnection GetConnection(); protected abstract IDataParameter GetParameter(); - protected abstract IDbDataAdapter GetDataAdapter(); - protected abstract void DeriveParameters(IDbCommand cmd); - protected abstract DataTable FillTable(IDbDataAdapter da); - - #endregion - - #region Factory - - public static CommandHelper CreateHelper(string providerAlias) - { - try - { - var dict = ConfigurationManager.GetSection("DataCommandProviders") as IDictionary; - if (dict == null) throw new Exception("Null Reference in DataAccess Provider configuration Session."); - - var providerConfig = dict[providerAlias] as ProviderAlias; - if (providerConfig == null) throw new Exception("Null Reference in Provider Alias configuration Session."); - - var providerType = providerConfig.TypeName; - ConnectionString = providerConfig.ConnectionString; - - var daType = Type.GetType(providerType); - if (daType == null) throw new Exception("Null Reference in Provider type configuration Session."); - - var provider = daType.Assembly.CreateInstance(daType.FullName); - if (provider is CommandHelper) return provider as CommandHelper; - - throw new Exception("The provider specified does not extends the AdoHelper abstract class."); - } - catch (Exception e) - { - throw new Exception("If the section is not defined on the configuration file this method can't be used to create an AdoHelper instance.", e); - } - } #endregion @@ -86,55 +54,6 @@ protected virtual void AttachParameters(IDbCommand command, IDataParameter[] com } } - protected void AssignParameterValues(IDataParameter[] commandParameters, DataRow dataRow) - { - if ((commandParameters == null) || (dataRow == null)) - { - return; - } - - var columns = dataRow.Table.Columns; - - var i = 0; - foreach (var commandParameter in commandParameters) - { - if (commandParameter.ParameterName == null || commandParameter.ParameterName.Length <= 1) - throw new Exception($"Please provide a valid parameter name on the parameter #{i}, the ParameterName property has the following value: '{commandParameter.ParameterName}'."); - - if (columns.Contains(commandParameter.ParameterName)) commandParameter.Value = dataRow[commandParameter.ParameterName]; - else if (columns.Contains(commandParameter.ParameterName.Substring(1))) commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)]; - - i++; - } - } - - protected void AssignParameterValues(IDataParameter[] commandParameters, object[] parameterValues) - { - if ((commandParameters == null) || (parameterValues == null)) - { - return; - } - - if (commandParameters.Length != parameterValues.Length) - { - throw new ArgumentException("Parameter count does not match Parameter Value count."); - } - - for (var i = 0; i < commandParameters.Length; i++) - { - var param = parameterValues[i] as IDataParameter; - if (param != null) - { - var paramInstance = param; - commandParameters[i].Value = paramInstance.Value ?? DBNull.Value; - - continue; - } - - commandParameters[i].Value = parameterValues[i] ?? DBNull.Value; - } - } - protected virtual bool PrepareCommand(IDbCommand command, IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDataParameter[] commandParameters) { var mustCloseConnection = false; @@ -167,10 +86,6 @@ protected virtual bool PrepareCommand(IDbCommand command, IDbConnection connecti return mustCloseConnection; } - protected virtual void ClearCommand(IDbCommand command) - { - } - #endregion private utility methods #region ExecuteNonCommand diff --git a/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs b/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs new file mode 100644 index 0000000..adabae2 --- /dev/null +++ b/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs @@ -0,0 +1,14 @@ +namespace ADO.ExecuteCommand.Helper +{ + public class DataAccessSectionSettings + { + public DataAccessSectionSettings(string type, string connectionString) + { + Type = type; + ConnectionString = connectionString; + } + + public string Type { get; } + public string ConnectionString { get; } + } +} diff --git a/ADO.ExecuteCommand/Helper/MsSql.cs b/ADO.ExecuteCommand.Core/Helper/MsSql.cs similarity index 64% rename from ADO.ExecuteCommand/Helper/MsSql.cs rename to ADO.ExecuteCommand.Core/Helper/MsSql.cs index 95ecf46..8cbe7e4 100644 --- a/ADO.ExecuteCommand/Helper/MsSql.cs +++ b/ADO.ExecuteCommand.Core/Helper/MsSql.cs @@ -7,6 +7,10 @@ namespace ADO.ExecuteCommand.Helper { public class MsSql : CommandHelper { + public MsSql(string connectionString) : base(connectionString) + { + } + public override IDbConnection GetConnection() { if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); @@ -28,24 +32,5 @@ protected override IDataParameter GetParameter() { return new SqlParameter(); } - - protected override IDbDataAdapter GetDataAdapter() - { - return new SqlDataAdapter(); - } - - protected override void DeriveParameters(IDbCommand cmd) - { - if (!(cmd is SqlCommand)) throw new ArgumentException("The command provided is not a SqlCommand instance.", nameof(cmd)); - SqlCommandBuilder.DeriveParameters((SqlCommand)cmd); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - var dt = new DataTable(); - ((SqlDataAdapter)da).Fill(dt); - - return dt; - } } } diff --git a/ADO.ExecuteCommand/Helper/PgSql.cs b/ADO.ExecuteCommand.Core/Helper/PgSql.cs similarity index 56% rename from ADO.ExecuteCommand/Helper/PgSql.cs rename to ADO.ExecuteCommand.Core/Helper/PgSql.cs index ed93f31..3e56b4e 100644 --- a/ADO.ExecuteCommand/Helper/PgSql.cs +++ b/ADO.ExecuteCommand.Core/Helper/PgSql.cs @@ -6,6 +6,10 @@ namespace ADO.ExecuteCommand.Helper { public class PgSql : CommandHelper { + public PgSql(string connectionString) : base(connectionString) + { + } + public override IDbConnection GetConnection() { if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); @@ -22,24 +26,5 @@ protected override IDataParameter GetParameter() { return new NpgsqlParameter(); } - - protected override IDbDataAdapter GetDataAdapter() - { - return new NpgsqlDataAdapter(); - } - - protected override void DeriveParameters(IDbCommand cmd) - { - if (!(cmd is NpgsqlCommand)) throw new ArgumentException("The command provided is not a NpgSqlCommand instance.", nameof(cmd)); - NpgsqlCommandBuilder.DeriveParameters((NpgsqlCommand)cmd); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - var dt = new DataTable(); - ((NpgsqlDataAdapter)da).Fill(dt); - - return dt; - } } } diff --git a/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs b/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..055d60e --- /dev/null +++ b/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ADO.ExecuteCommand.Core")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b7737b4f-4c59-4ce5-aa62-0a6cca639473")] diff --git a/ADO.ExecuteCommand.Core/project.json b/ADO.ExecuteCommand.Core/project.json new file mode 100644 index 0000000..2e7bc9f --- /dev/null +++ b/ADO.ExecuteCommand.Core/project.json @@ -0,0 +1,17 @@ +{ + "version": "1.0.0-*", + + "dependencies": { + "NETStandard.Library": "1.6.0", + "Npgsql": "3.1.8", + "System.Collections.NonGeneric": "4.0.1", + "System.Data.Common": "4.1.0", + "System.Data.SqlClient": "4.1.0" + }, + + "frameworks": { + "netstandard1.4": { + "imports": "dnxcore50" + } + } +} diff --git a/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs b/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs index 696b376..71243a0 100644 --- a/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs +++ b/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs @@ -12,6 +12,10 @@ public class MockCommandHelper : CommandHelper { private IList parameters; + public MockCommandHelper(string connectionString) : base(connectionString) + { + } + public IList> ReturnValues { get; set; } public override IDbConnection GetConnection() @@ -42,46 +46,6 @@ protected override IDataParameter GetParameter() return parameter; } - protected override IDbDataAdapter GetDataAdapter() - { - var dba = MockRepository.GenerateMock(); - dba.Expect(da => da.SelectCommand); - - return dba; - } - - protected override void DeriveParameters(IDbCommand cmd) - { - throw new NotImplementedException(); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - if (this.ReturnValues == null || !this.ReturnValues.Any()) throw new NoNullAllowedException(); - - var dt = new DataTable(); - dt.Clear(); - - foreach (var col in this.ReturnValues[0].Keys) - { - dt.Columns.Add(col); - } - - foreach (var rows in this.ReturnValues) - { - var row = dt.NewRow(); - - foreach (var returnValue in rows) - { - row[returnValue.Key] = returnValue.Value; - } - - dt.Rows.Add(row); - } - - return dt; - } - public IEnumerable Parameters => this.parameters; } } diff --git a/ADO.ExecuteCommand.Test/ParametersTest.cs b/ADO.ExecuteCommand.Test/ParametersTest.cs index 0c657ba..e8232da 100644 --- a/ADO.ExecuteCommand.Test/ParametersTest.cs +++ b/ADO.ExecuteCommand.Test/ParametersTest.cs @@ -13,7 +13,7 @@ public class ParametersTest [TestMethod] public void TestParametersInQuery() { - var commandHelper = new MockCommandHelper + var commandHelper = new MockCommandHelper(null) { ReturnValues = new List> { @@ -43,7 +43,7 @@ public void TestParametersInQuery() [TestMethod] public void TestNullParametersInQuery() { - var queryRunner = new MockCommandHelper + var queryRunner = new MockCommandHelper(null) { ReturnValues = new List> { diff --git a/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs b/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs index 83dcc7a..6dc74d2 100644 --- a/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs +++ b/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.0.1")] +[assembly: AssemblyFileVersion("1.0.0.1")] diff --git a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj index 4cac692..8924892 100644 --- a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj +++ b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj @@ -45,16 +45,12 @@ 4 - - ..\packages\Npgsql.2.2.5\lib\net45\Mono.Security.dll - True - ..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll True - - ..\packages\Npgsql.2.2.5\lib\net45\Npgsql.dll + + ..\packages\Npgsql.3.1.8\lib\net45\Npgsql.dll True @@ -68,14 +64,28 @@ - - - + + Commands\Command.cs + + + Commands\CommandBatch.cs + + + Helper\CommandHelper.cs + + + Helper\DataAccessSectionSettings.cs + + + Helper\MsSql.cs + + + Helper\PgSql.cs + + - - diff --git a/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs b/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs new file mode 100644 index 0000000..7ac7c99 --- /dev/null +++ b/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections; +using System.Configuration; + +namespace ADO.ExecuteCommand.Helper +{ + public abstract partial class CommandHelper + { + #region - Factory - + + public static CommandHelper CreateHelper(string providerAlias) + { + try + { + var dict = ConfigurationManager.GetSection("daProviders") as IDictionary; + if (dict == null) throw new Exception("Null Reference in DataAccess Provider configuration Session."); + + var providerConfig = dict[providerAlias] as ProviderAlias; + if (providerConfig == null) throw new Exception("Null Reference in Provider Alias configuration Session."); + + return CreateHelper(new DataAccessSectionSettings(providerConfig.TypeName, providerConfig.ConnectionString)); + } + catch (Exception e) + { + throw new Exception("If the section is not defined on the configuration file this method can't be used to create an AdoHelper instance.", e); + } + } + + public static CommandHelper CreateHelper(DataAccessSectionSettings settings) + { + try + { + var providerType = settings.Type; + + var daType = Type.GetType(providerType); + if (daType == null) throw new NullReferenceException("Null Reference in Provider type configuration Session."); + + var provider = Activator.CreateInstance(daType, settings.ConnectionString); + if (provider is CommandHelper) + { + return provider as CommandHelper; + } + + throw new Exception("The provider specified does not extends the QueryRunner abstract class."); + } + catch (Exception e) + { + throw new Exception("If the section is not defined on the configuration file this method can't be used to create an QueryRunner instance.", e); + } + } + + #endregion + } +} diff --git a/ADO.ExecuteCommand/Helper/MySql.cs b/ADO.ExecuteCommand/Helper/MySql.cs index bcadf9f..0fcd825 100644 --- a/ADO.ExecuteCommand/Helper/MySql.cs +++ b/ADO.ExecuteCommand/Helper/MySql.cs @@ -6,50 +6,19 @@ namespace ADO.ExecuteCommand.Helper { public sealed class MySql : CommandHelper { - public override IDbConnection GetConnection() + public MySql(string connectionString) : base(connectionString) { - if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); - return new MySqlConnection( ConnectionString ); } - protected override IDbDataAdapter GetDataAdapter() - { - return new MySqlDataAdapter(); - } - - protected override void DeriveParameters(IDbCommand cmd) + public override IDbConnection GetConnection() { - if (!(cmd is MySqlCommand)) throw new ArgumentException("The command provided is not a MySqlCommand instance.", nameof(cmd)); - MySqlCommandBuilder.DeriveParameters((MySqlCommand)cmd); + if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString"); + return new MySqlConnection( ConnectionString ); } protected override IDataParameter GetParameter() { return new MySqlParameter(); } - - protected override void ClearCommand(IDbCommand command) - { - var canClear = true; - foreach(IDataParameter commandParameter in command.Parameters) - { - if (commandParameter.Direction != ParameterDirection.Input) canClear = false; - } - - if (canClear) - { - command.Parameters.Clear(); - } - - command.Parameters.Clear(); - } - - protected override DataTable FillTable(IDbDataAdapter da) - { - var dt = new DataTable(); - ((MySqlDataAdapter) da).Fill(dt); - - return dt; - } } } \ No newline at end of file diff --git a/ADO.ExecuteCommand/packages.config b/ADO.ExecuteCommand/packages.config index 907e477..3f7fbbe 100644 --- a/ADO.ExecuteCommand/packages.config +++ b/ADO.ExecuteCommand/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg b/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg new file mode 100644 index 0000000..2751ca9 Binary files /dev/null and b/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg differ diff --git a/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg b/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg new file mode 100644 index 0000000..157c706 Binary files /dev/null and b/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg differ diff --git a/Thin.Database.CommandLayer.sln b/Thin.Database.CommandLayer.sln index b526931..18e4c8d 100644 --- a/Thin.Database.CommandLayer.sln +++ b/Thin.Database.CommandLayer.sln @@ -7,6 +7,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ADO.ExecuteCommand", "ADO.E EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ADO.ExecuteCommand.Test", "ADO.ExecuteCommand.Test\ADO.ExecuteCommand.Test.csproj", "{CDCF391D-B31A-4A58-861D-199456E56368}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET Core", "NET Core", "{E4767CC8-7D5E-47F0-B190-9A5818B1B09A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET Framework 4.5", "NET Framework 4.5", "{C24B7231-5233-49C9-8C84-D4FEFA90FDB3}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ADO.ExecuteCommand.Core", "ADO.ExecuteCommand.Core\ADO.ExecuteCommand.Core.xproj", "{B7737B4F-4C59-4CE5-AA62-0A6CCA639473}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,8 +27,17 @@ Global {CDCF391D-B31A-4A58-861D-199456E56368}.Debug|Any CPU.Build.0 = Debug|Any CPU {CDCF391D-B31A-4A58-861D-199456E56368}.Release|Any CPU.ActiveCfg = Release|Any CPU {CDCF391D-B31A-4A58-861D-199456E56368}.Release|Any CPU.Build.0 = Release|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {D6653B75-F3DC-4C5D-ADAA-B70F24D66A95} = {C24B7231-5233-49C9-8C84-D4FEFA90FDB3} + {CDCF391D-B31A-4A58-861D-199456E56368} = {C24B7231-5233-49C9-8C84-D4FEFA90FDB3} + {B7737B4F-4C59-4CE5-AA62-0A6CCA639473} = {E4767CC8-7D5E-47F0-B190-9A5818B1B09A} + EndGlobalSection EndGlobal