Added suport for DynamicColumn in DynamicProcedureInvoker

This commit is contained in:
grzegorz.russek
2022-02-22 07:52:06 +00:00
parent 54b4f2de22
commit f01ba13ad9
8 changed files with 146 additions and 143 deletions

View File

@@ -685,6 +685,7 @@ namespace DynamORM
/// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary> /// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary>
public DynamicColumn() public DynamicColumn()
{ {
ParameterDirection = ParameterDirection.Input;
} }
/// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary> /// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary>
@@ -726,6 +727,9 @@ namespace DynamORM
/// <summary>Gets or sets order direction.</summary> /// <summary>Gets or sets order direction.</summary>
public SortOrder Order { get; set; } public SortOrder Order { get; set; }
/// <summary>Gets or sets parameter direction when used in procedure invocation.</summary>
public ParameterDirection ParameterDirection { get; set; }
/// <summary>Gets or sets value for parameters.</summary> /// <summary>Gets or sets value for parameters.</summary>
public object Value { get; set; } public object Value { get; set; }
@@ -5371,6 +5375,37 @@ namespace DynamORM
cmd.AddParameters(_db, (DynamicExpando)arg); cmd.AddParameters(_db, (DynamicExpando)arg);
else if (arg is ExpandoObject) else if (arg is ExpandoObject)
cmd.AddParameters(_db, (ExpandoObject)arg); cmd.AddParameters(_db, (ExpandoObject)arg);
else if (arg is DynamicColumn)
{
var dcv = (DynamicColumn)arg;
string paramName = dcv.Alias ?? dcv.ColumnName ??
(dcv.Schema.HasValue ? dcv.Schema.Value.Name : null) ??
(info.ArgumentNames.Count > i ? info.ArgumentNames[i] : i.ToString());
bool isOut = dcv.ParameterDirection == ParameterDirection.Output ||
dcv.ParameterDirection == ParameterDirection.ReturnValue;
if (isOut || dcv.ParameterDirection == ParameterDirection.InputOutput)
{
if (retParams == null)
retParams = new Dictionary<string, int>();
retParams.Add(paramName, cmd.Parameters.Count);
}
if (dcv.Schema != null)
{
var ds = dcv.Schema.Value;
cmd.AddParameter(
_db.GetParameterName(paramName), dcv.ParameterDirection,
ds.Type, ds.Size, ds.Precision, ds.Scale,
isOut ? DBNull.Value : arg);
}
else
cmd.AddParameter(
_db.GetParameterName(paramName), dcv.ParameterDirection,
arg == null ? DbType.String : arg.GetType().ToDbType(), 0, isOut ? DBNull.Value : arg);
}
else else
{ {
if (info.ArgumentNames.Count > i && !string.IsNullOrEmpty(info.ArgumentNames[i])) if (info.ArgumentNames.Count > i && !string.IsNullOrEmpty(info.ArgumentNames[i]))
@@ -5473,7 +5508,7 @@ namespace DynamORM
using (IDataReader rdr = cmd.ExecuteReader()) using (IDataReader rdr = cmd.ExecuteReader())
if (rdr.Read()) if (rdr.Read())
mainResult = (rdr.ToDynamic() as object).Map(types[0]); mainResult = (rdr.RowToDynamic() as object).Map(types[0]);
else else
mainResult = null; mainResult = null;
} }

View File

@@ -3,13 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59 VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamORM", "DynamORM\DynamORM.csproj", "{63963ED7-9C78-4672-A4D4-339B6E825503}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamORM", "DynamORM\DynamORM.csproj", "{63963ED7-9C78-4672-A4D4-339B6E825503}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamORM.Tests", "DynamORM.Tests\DynamORM.Tests.csproj", "{D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamORM.Tests", "DynamORM.Tests\DynamORM.Tests.csproj", "{D5013B4E-8A1B-4DBB-8FB5-E09935F4F764}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AmalgamationTool", "AmalgamationTool\AmalgamationTool.csproj", "{A64D2052-D0CD-488E-BF05-E5952615D926}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AmalgamationTool", "AmalgamationTool\AmalgamationTool.csproj", "{A64D2052-D0CD-488E-BF05-E5952615D926}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tester", "Tester\Tester.csproj", "{F747AA57-BEA7-4FB8-B371-546296789AEF}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tester", "Tester\Tester.csproj", "{F747AA57-BEA7-4FB8-B371-546296789AEF}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -53,7 +53,8 @@ Global
{A64D2052-D0CD-488E-BF05-E5952615D926}.Release|Mixed Platforms.Build.0 = Release|x86 {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.ActiveCfg = Release|x86
{A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.Build.0 = Release|x86 {A64D2052-D0CD-488E-BF05-E5952615D926}.Release|x86.Build.0 = Release|x86
{F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Any CPU.ActiveCfg = Debug|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Mixed Platforms.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 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|Mixed Platforms.Build.0 = Debug|x86
{F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|x86.ActiveCfg = Debug|x86 {F747AA57-BEA7-4FB8-B371-546296789AEF}.Debug|x86.ActiveCfg = Debug|x86

View File

@@ -28,6 +28,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Text; using System.Text;
namespace DynamORM namespace DynamORM
@@ -88,6 +89,7 @@ namespace DynamORM
/// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary> /// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary>
public DynamicColumn() public DynamicColumn()
{ {
ParameterDirection = ParameterDirection.Input;
} }
/// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary> /// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary>
@@ -129,6 +131,9 @@ namespace DynamORM
/// <summary>Gets or sets order direction.</summary> /// <summary>Gets or sets order direction.</summary>
public SortOrder Order { get; set; } public SortOrder Order { get; set; }
/// <summary>Gets or sets parameter direction when used in procedure invocation.</summary>
public ParameterDirection ParameterDirection { get; set; }
/// <summary>Gets or sets value for parameters.</summary> /// <summary>Gets or sets value for parameters.</summary>
public object Value { get; set; } public object Value { get; set; }

View File

@@ -1014,7 +1014,7 @@ namespace DynamORM
public static List<dynamic> ToList(this IDataReader r) public static List<dynamic> ToList(this IDataReader r)
{ {
List<dynamic> result = new List<dynamic>(); List<dynamic> result = new List<dynamic>();
while (r.Read()) while (r.Read())
result.Add(r.RowToDynamic()); result.Add(r.RowToDynamic());

View File

@@ -115,6 +115,35 @@ namespace DynamORM
cmd.AddParameters(_db, (DynamicExpando)arg); cmd.AddParameters(_db, (DynamicExpando)arg);
else if (arg is ExpandoObject) else if (arg is ExpandoObject)
cmd.AddParameters(_db, (ExpandoObject)arg); cmd.AddParameters(_db, (ExpandoObject)arg);
else if (arg is DynamicColumn)
{
var dcv = (DynamicColumn)arg;
string paramName = dcv.Alias ?? dcv.ColumnName ??
(dcv.Schema.HasValue ? dcv.Schema.Value.Name : null) ??
(info.ArgumentNames.Count > i ? info.ArgumentNames[i] : i.ToString());
bool isOut = dcv.ParameterDirection == ParameterDirection.Output ||
dcv.ParameterDirection == ParameterDirection.ReturnValue;
if (isOut || dcv.ParameterDirection == ParameterDirection.InputOutput)
{
if (retParams == null)
retParams = new Dictionary<string, int>();
retParams.Add(paramName, cmd.Parameters.Count);
}
if (dcv.Schema != null) {
var ds = dcv.Schema.Value;
cmd.AddParameter(
_db.GetParameterName(paramName), dcv.ParameterDirection,
ds.Type, ds.Size, ds.Precision, ds.Scale,
isOut ? DBNull.Value : arg);
} else
cmd.AddParameter(
_db.GetParameterName(paramName), dcv.ParameterDirection,
arg == null ? DbType.String : arg.GetType().ToDbType(), 0, isOut ? DBNull.Value : arg);
}
else else
{ {
if (info.ArgumentNames.Count > i && !string.IsNullOrEmpty(info.ArgumentNames[i])) if (info.ArgumentNames.Count > i && !string.IsNullOrEmpty(info.ArgumentNames[i]))
@@ -217,7 +246,7 @@ namespace DynamORM
using (IDataReader rdr = cmd.ExecuteReader()) using (IDataReader rdr = cmd.ExecuteReader())
if (rdr.Read()) if (rdr.Read())
mainResult = (rdr.ToDynamic() as object).Map(types[0]); mainResult = (rdr.RowToDynamic() as object).Map(types[0]);
else else
mainResult = null; mainResult = null;
} }

View File

@@ -5,13 +5,14 @@ namespace Tester
{ {
internal class Program internal class Program
{ {
private static DynamORM.DynamicDatabase GetORM() private static DynamicDatabase GetORM()
{ {
return new DynamORM.DynamicDatabase(System.Data.SqlClient.SqlClientFactory.Instance, return new DynamicDatabase(System.Data.SqlClient.SqlClientFactory.Instance,
//"packet size=4096;User Id=sa;Password=Sa123;data source=192.168.1.9,1434;initial catalog=MAH_Melle-GAGARIN;", //"packet size=4096;User Id=sa;Password=Sa123;data source=192.168.1.9,1434;initial catalog=MAH_Melle-GAGARIN;",
"packet size=4096;User Id=sa;Password=sa123;data source=192.168.1.9,1433;initial catalog=MOM_NEXT_Florentyna_WMS_PROD;", //"packet size=4096;User Id=sa;Password=sa123;data source=192.168.1.9,1433;initial catalog=MOM_NEXT_Florentyna_WMS_PROD;",
DynamORM.DynamicDatabaseOptions.SingleConnection | DynamORM.DynamicDatabaseOptions.SingleTransaction | DynamORM.DynamicDatabaseOptions.SupportStoredProcedures | "packet size=4096;User Id=sa;Password=sa123;data source=192.168.0.6;initial catalog=DynamORM;",
DynamORM.DynamicDatabaseOptions.SupportSchema | DynamORM.DynamicDatabaseOptions.SupportTop); DynamicDatabaseOptions.SingleConnection | DynamicDatabaseOptions.SingleTransaction | DynamicDatabaseOptions.SupportSchema |
DynamicDatabaseOptions.SupportStoredProcedures | DynamicDatabaseOptions.SupportTop | DynamicDatabaseOptions.DumpCommands);
////return new DynamORM.DynamicDatabase(System.Data.SQLite.SQLiteFactory.Instance, ////return new DynamORM.DynamicDatabase(System.Data.SQLite.SQLiteFactory.Instance,
//// "Data Source=test.db3;", //// "Data Source=test.db3;",
@@ -21,30 +22,43 @@ namespace Tester
private static void Main(string[] args) private static void Main(string[] args)
{ {
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;"); var c = new System.Data.SqlClient.SqlConnection("packet size=4096;User Id=sa;Password=sa123;data source=192.168.0.6;initial catalog=DynamORM;");
DynamicDatabase db = new DynamicDatabase(c, using (var db = GetORM())
DynamicDatabaseOptions.SingleConnection | DynamicDatabaseOptions.SingleTransaction | DynamicDatabaseOptions.SupportSchema |
DynamicDatabaseOptions.SupportStoredProcedures | DynamicDatabaseOptions.SupportTop | DynamicDatabaseOptions.DumpCommands);
try
{ {
try
{
db.Execute("DROP TABLE Experiments ");
}
catch { }
db.Execute("CREATE TABLE Experiments (t1 nvarchar(50) NOT NULL DEFAULT N'', t2 varchar(50) NOT NULL DEFAULT '');");
//var q = db.From(x => x.Experiments.As(x.e1));
//q
// .Where(x => x.t2 = "Dupa")
// .Where(x => x.Exists(
// q.SubQuery()
// .From(y => y.Experiments.As(x.e2))
// .Where(y => y.e2.t1 == y.e1.t1)))
// .Execute().ToList();
db.Execute("DROP TABLE Experiments "); db.Execute("DROP TABLE Experiments ");
var resL = db.Procedures.GetProductDesc<IOrderedEnumerable<GetProductDesc_Result>>();
var res = db.Procedures.GetProductDesc_withparameters<GetProductDesc_Result>(PID: 707);
res = db.Procedures.GetProductDesc_withDefaultparameters<GetProductDesc_Result>();
int id = -1;
var resD = db.Procedures.ins_NewEmp_with_outputparamaters(Ename: "Test2", out_EId: id);
} }
catch { } }
db.Execute("CREATE TABLE Experiments (t1 nvarchar(50) NOT NULL DEFAULT N'', t2 varchar(50) NOT NULL DEFAULT '');"); private class GetProductDesc_Result
{
var q = db.From(x => x.Experiments.As(x.e1)); public virtual int ProductID { get; set; }
q public virtual string ProductName { get; set; }
.Where(x => x.t2 = "Dupą") public virtual string ProductDescription { get; set; }
.Where(x => x.Exists(
q.SubQuery()
.From(y => y.Experiments.As(x.e2))
.Where(y => y.e2.t1 == y.e1.t1)))
.Execute().ToList();
db.Execute("DROP TABLE Experiments ");
} }
} }
} }

View File

@@ -1,36 +0,0 @@
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: AssemblyTitle("Tester")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Tester")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 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("dbff9475-06f5-400e-bc17-57c14d9d9cb9")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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")]

View File

@@ -1,77 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <OutputType>Exe</OutputType>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> <TargetFramework>netcoreapp3.1</TargetFramework>
<ProductVersion>8.0.30703</ProductVersion> <Copyright>Copyright © RUSSEK Software 2012-2022</Copyright>
<SchemaVersion>2.0</SchemaVersion> <Company>RUSSEK Software</Company>
<ProjectGuid>{F747AA57-BEA7-4FB8-B371-546296789AEF}</ProjectGuid> <Authors>Grzegorz Russek</Authors>
<OutputType>Exe</OutputType> <VersionPrefix>1.2.1</VersionPrefix>
<AppDesignerFolder>Properties</AppDesignerFolder> <RepositoryUrl>https://svn.dr4cul4.pl/svn/DynamORM/</RepositoryUrl>
<RootNamespace>Tester</RootNamespace> <PackageProjectUrl>https://dr4cul4.pl</PackageProjectUrl>
<AssemblyName>Tester</AssemblyName> <Product>DynamORM</Product>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion> <PackageLicenseExpression>MIT</PackageLicenseExpression>
<TargetFrameworkProfile> <OutputType>Exe</OutputType>
</TargetFrameworkProfile> </PropertyGroup>
<FileAlignment>512</FileAlignment>
</PropertyGroup> <ItemGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PlatformTarget>x86</PlatformTarget> <PackageReference Include="System.Data.Common" Version="4.3.0" />
<DebugSymbols>true</DebugSymbols> <PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
<DebugType>full</DebugType> </ItemGroup>
<Optimize>false</Optimize> <ItemGroup Condition="$(TargetFramework.StartsWith('net4')) AND '$(MSBuildRuntimeType)' == 'Core' AND '$(OS)' != 'Windows_NT'">
<OutputPath>bin\Debug\</OutputPath> <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.2" PrivateAssets="All" />
<DefineConstants>DEBUG;TRACE</DefineConstants> </ItemGroup>
<ErrorReport>prompt</ErrorReport> <ItemGroup>
<WarningLevel>4</WarningLevel> <ProjectReference Include="..\DynamORM\DynamORM.csproj" />
<Externalconsole>true</Externalconsole> </ItemGroup>
<Prefer32Bit>false</Prefer32Bit> <ItemGroup>
</PropertyGroup> <Folder Include="Properties\" />
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> </ItemGroup>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType> </Project>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Externalconsole>true</Externalconsole>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64">
<HintPath>C:\Program Files\System.Data.SQLite\2010\bin\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="ProfilingSessions\Session20141128_203722.sdps" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DynamORM\DynamORM.csproj">
<Project>{63963ED7-9C78-4672-A4D4-339B6E825503}</Project>
<Name>DynamORM</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>