diff --git a/DynamORM.sln b/DynamORM.sln index 1080a4b..a6de29c 100644 --- a/DynamORM.sln +++ b/DynamORM.sln @@ -1,6 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.136 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamORM", "DynamORM\DynamORM.csproj", "{63963ED7-9C78-4672-A4D4-339B6E825503}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamORM.Tests", "DynamORM.Tests\DynamORM.Tests.csproj", "{D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}" @@ -9,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AmalgamationTool", "Amalgam EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tester", "Tester\Tester.csproj", "{F747AA57-BEA7-4FB8-B371-546296789AEF}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamORM.Core", "DynamORM\DynamORM.Core.csproj", "{90D18618-B92E-41E5-9099-A7352E4E5C18}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -29,6 +33,16 @@ Global {63963ED7-9C78-4672-A4D4-339B6E825503}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {63963ED7-9C78-4672-A4D4-339B6E825503}.Release|Mixed Platforms.Build.0 = Release|Any CPU {63963ED7-9C78-4672-A4D4-339B6E825503}.Release|x86.ActiveCfg = Release|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|x86.ActiveCfg = Debug|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Any CPU.Build.0 = Release|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|x86.ActiveCfg = Release|Any CPU {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Any CPU.ActiveCfg = Debug|x86 {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Any CPU.Build.0 = Debug|x86 {A64D2052-D0CD-488E-BF05-E5952615D926}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 @@ -41,16 +55,6 @@ Global {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Mixed Platforms.Build.0 = Release|x86 {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.ActiveCfg = Release|x86 {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.Build.0 = Release|x86 - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Debug|x86.ActiveCfg = Debug|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Any CPU.Build.0 = Release|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}.Release|x86.ActiveCfg = Release|Any CPU {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Any CPU.ActiveCfg = Debug|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Mixed Platforms.Build.0 = Debug|x86 @@ -61,11 +65,26 @@ Global {F747AA57-BEA7-4FB8-B371-546296789AEF}.Release|Mixed Platforms.Build.0 = Release|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Release|x86.ActiveCfg = Release|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = Tester\Tester.csproj + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Debug|x86.ActiveCfg = Debug|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Debug|x86.Build.0 = Debug|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Release|Any CPU.Build.0 = Release|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Release|x86.ActiveCfg = Release|Any CPU + {90D18618-B92E-41E5-9099-A7352E4E5C18}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B94FC164-4357-4FDA-A844-5202FA8C5E4B} + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + StartupItem = Tester\Tester.csproj + EndGlobalSection EndGlobal diff --git a/DynamORM/DynamORM.Core.csproj b/DynamORM/DynamORM.Core.csproj new file mode 100644 index 0000000..082a09f --- /dev/null +++ b/DynamORM/DynamORM.Core.csproj @@ -0,0 +1,17 @@ + + + + netcoreapp2.2 + Dynamic Object-Relational Mapping library. + Copyright © RUSSEK Software 2012-2019 + RUSSEK Software + Grzegorz Russek + 1.1.0.1 + 1.1.0.1 + https://dr4cul4.pl/svn/DynamORM/ + https://dr4cul4.pl + DynamORM + false + + + diff --git a/DynamORM/DynamicDatabase.cs b/DynamORM/DynamicDatabase.cs index f568dec..bffd1fc 100644 --- a/DynamORM/DynamicDatabase.cs +++ b/DynamORM/DynamicDatabase.cs @@ -33,6 +33,7 @@ using System.Data; using System.Data.Common; using System.Dynamic; using System.Linq; +using System.Reflection; using System.Text; using DynamORM.Builders; using DynamORM.Builders.Extensions; @@ -166,19 +167,61 @@ namespace DynamORM InitCommon(connectionString, options); } + private DbProviderFactory FindDbProviderFactoryFromConnection(Type t) + { + foreach (var type in t.Assembly.GetTypes().Where(x => x.IsSubclassOf(typeof(DbProviderFactory)))) + { + DbProviderFactory provider = null; + bool dispose = false; + + var pi = type.GetProperty("Instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.GetProperty); + if (pi != null) + provider = (DbProviderFactory)pi.GetValue(null, null); + else + { + var fi = type.GetField("Instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.GetField); + if (fi != null) + provider = (DbProviderFactory)fi.GetValue(null); + } + + if (provider == null) + { + var ci = type.GetConstructor(Type.EmptyTypes); + if (ci != null) + { + provider = ci.Invoke(null) as DbProviderFactory; + dispose = true; + } + } + + try + { + if (provider != null) + { + using (var c = provider.CreateConnection()) + { + if (c.GetType() == t) + return provider; + } + } + } + finally + { + if (provider != null && dispose && provider is IDisposable) + ((IDisposable)provider).Dispose(); + } + } + + return null; + } + /// Initializes a new instance of the class. /// Active database connection. /// Connection options. required. public DynamicDatabase(IDbConnection connection, DynamicDatabaseOptions options) { // Try to find correct provider if possible - Type t = connection.GetType(); - if (t == typeof(System.Data.SqlClient.SqlConnection)) - _provider = System.Data.SqlClient.SqlClientFactory.Instance; - else if (t == typeof(System.Data.Odbc.OdbcConnection)) - _provider = System.Data.Odbc.OdbcFactory.Instance; - else if (t == typeof(System.Data.OleDb.OleDbConnection)) - _provider = System.Data.OleDb.OleDbFactory.Instance; + _provider = FindDbProviderFactoryFromConnection(connection.GetType()); IsDisposed = false; InitCommon(connection.ConnectionString, options); @@ -1441,7 +1484,7 @@ namespace DynamORM Type type = (Type)schema.DATATYPE; // Small hack for SQL Server Provider - if (type == typeof(string) && Provider != null && Provider.GetType() == typeof(System.Data.SqlClient.SqlClientFactory)) + if (type == typeof(string) && Provider != null && Provider.GetType().Name == "SqlClientFactory") { var map = schema as IDictionary; string typeName = (map.TryGetValue("DATATYPENAME") ?? string.Empty).ToString(); diff --git a/DynamORM/Properties/AssemblyInfo.cs b/DynamORM/Properties/AssemblyInfo.cs index 9d9dd14..a91163f 100644 --- a/DynamORM/Properties/AssemblyInfo.cs +++ b/DynamORM/Properties/AssemblyInfo.cs @@ -45,7 +45,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("RUSSEK Software")] [assembly: AssemblyProduct("DynamORM")] -[assembly: AssemblyCopyright("Copyright © RUSSEK Software 2012")] +[assembly: AssemblyCopyright("Copyright © RUSSEK Software 2012-2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/Tester/Program.cs b/Tester/Program.cs index dfb0f44..6af862e 100644 --- a/Tester/Program.cs +++ b/Tester/Program.cs @@ -21,7 +21,9 @@ namespace Tester private static void Main(string[] args) { - DynamicDatabase db = new DynamicDatabase(System.Data.SqlClient.SqlClientFactory.Instance, "packet size=4096;User Id=sa;Password=Sa123;data source=127.0.0.1,1434;initial catalog=MAH_Levant;", + var c = new System.Data.SqlClient.SqlConnection("packet size=4096;User Id=sa;Password=Sa123;data source=127.0.0.1,1434;initial catalog=MAH_Levant;"); + + DynamicDatabase db = new DynamicDatabase(c, DynamicDatabaseOptions.SingleConnection | DynamicDatabaseOptions.SingleTransaction | DynamicDatabaseOptions.SupportSchema | DynamicDatabaseOptions.SupportStoredProcedures | DynamicDatabaseOptions.SupportTop | DynamicDatabaseOptions.DumpCommands);