Skip to content

Commit 450bd3c

Browse files
authored
Merge pull request #5 from DIPSASA/feature/parameterStatus
Feature/parameter status
2 parents f84ad7d + 425a690 commit 450bd3c

11 files changed

Lines changed: 108 additions & 68 deletions

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ Oracle support for Dapper Micro ORM.
55
### Introduction
66

77
Dapper is a great tool if you want to write database-agnostic code.
8-
However, sometimes you need to access functionality that is provider-specific. This assembly adds support for writing Oracle-specific SQL, that supports all dbtypes used by the managed provider on a parameter, supports setting various properties on the command(LOBFetchSize, ArrayBindCount, BindByName), as well as setting CollectionType on the parameter.
8+
However, sometimes you need to access functionality that is provider-specific. This assembly adds support for writing Oracle-specific SQL, that supports all dbtypes used by the Oracle managed provider on a parameter, supports setting various properties on the command(LOBFetchSize, ArrayBindCount, BindByName), as well as setting CollectionType on the parameter.
99
Using this package, you can now run stored procedures that returns RefCursor, or use array bind count to execute a sql statements with a array of parameters.
1010

1111
### Supported Oracle-specific properties
1212
**OracleParameter(Managed and UnManaged)**
1313
- OracleDbType enum (all members used by the managed provider)
1414
- CollectionType enum
15+
- ParameterStatus (return type when executing stored procedure)
16+
- ArrayBindSize
1517

1618
**OracleCommand (Managed and UnManaged)**
1719
- ArrayBindCount property
@@ -52,6 +54,11 @@ public void RunStoredProcedureWithArrayAsParameters(IEnumerable<long> idvalues)
5254
}
5355
```
5456

57+
## Building
58+
From a powershell script, run build.ps1 from the root folder of the repo.
59+
Example
60+
build.ps1 -Task Compile
61+
5562

5663

5764

default.ps1

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ function Write-PaketTemplateFiles()
8181
}
8282
}
8383

84+
function Write-Documentation
85+
{
86+
Write-Host "Available tasks:Clean,Init,Compile,Test,Package"
87+
Write-Host "Usage example: build.ps1 -Tasks Test,Package"
88+
}
89+
8490

8591
function Update-AssemblyInfoFiles ([string] $version, [string]$assemblyInformalVersion) {
8692
#-------------------------------------------------------------------------------

releasenotes.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# Releasenotes
22

3+
### 0.9.7
4+
- Added Status to OracleParameter, this is returned by some stored procs.
35
### 0.9.6
46
- Added ArrayBindSize property to OracleParameter, can now set this property on OracleCommand for both managed and unmanaged driver.
57
### 0.9.5
68
- Made OracleDynamicParameters.AddParameters virtual, so that it can be extended in a derived class.
79
### 0.9.0
8-
Initial commit to Github.
10+
- Initial commit to Github.

src/Dapper.Oracle/OracleDynamicParameters.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ namespace Dapper.Oracle
1111
/// Parameter support for Oracle-specific types and functions. For use with Dapper.
1212
/// Implements <see cref="SqlMapper.IDynamicParameters"/>.
1313
/// </summary>
14-
public class OracleDynamicParameters : SqlMapper.IDynamicParameters
14+
public partial class OracleDynamicParameters : SqlMapper.IDynamicParameters
1515
{
1616
private static Dictionary<SqlMapper.Identity, Action<IDbCommand, object>> ParamReaderCache { get; } = new Dictionary<SqlMapper.Identity, Action<IDbCommand, object>>();
1717

18-
private Dictionary<string, ParamInfo> Parameters { get; } = new Dictionary<string, ParamInfo>();
18+
private Dictionary<string, OracleParameterInfo> Parameters { get; } = new Dictionary<string, OracleParameterInfo>();
1919

2020
private List<object> templates;
2121

@@ -119,11 +119,11 @@ public void Add(
119119
string sourceColumn = null,
120120
DataRowVersion? sourceVersion = null,
121121
OracleMappingCollectionType? collectionType = null,
122-
int[] arrayBindSize= null)
122+
int[] arrayBindSize = null)
123123
{
124-
Parameters[Clean(name)] = new ParamInfo()
124+
Parameters[Clean(name)] = new OracleParameterInfo()
125125
{
126-
Name = name,
126+
Name = Clean(name),
127127
Value = value,
128128
ParameterDirection = direction ?? ParameterDirection.Input,
129129
DbType = dbType,
@@ -161,6 +161,11 @@ public T Get<T>(string name)
161161
return OracleValueConverter.Convert<T>(val);
162162
}
163163

164+
public OracleParameterInfo GetParameter(string name)
165+
{
166+
return OracleMethodHelper.GetParameterInfo(Parameters[Clean(name)].AttachedParam);
167+
}
168+
164169
void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Identity identity)
165170
{
166171
AddParameters(command, identity);
@@ -263,7 +268,10 @@ private static string Clean(string name)
263268
return name;
264269
}
265270

266-
internal class ParamInfo
271+
/// <summary>
272+
/// Class used to pass parameter information to and from the OracleCommand object
273+
/// </summary>
274+
public class OracleParameterInfo
267275
{
268276
public string Name { get; set; }
269277

@@ -289,6 +297,8 @@ internal class ParamInfo
289297

290298
public int[] ArrayBindSize { get; set; } = null;
291299

300+
public OracleParameterMappingStatus Status { get; set; }
301+
292302
public IDbDataParameter AttachedParam { get; set; }
293303
}
294304
}

src/Dapper.Oracle/OracleMappingType.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,15 @@ public enum OracleMappingCollectionType
4444
None,
4545
PLSQLAssociativeArray,
4646
}
47+
48+
/// <summary>
49+
/// Mapping enum to map Parameter status for OracleParameter
50+
/// </summary>
51+
public enum OracleParameterMappingStatus
52+
{
53+
Success,
54+
NullFetched,
55+
NullInsert,
56+
Truncation,
57+
}
4758
}

src/Dapper.Oracle/OracleMethodHelper.cs

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static void SetBindByName(IDbCommand command, bool bindByName)
2525
Get(command).BindByName.SetValue(command, bindByName);
2626
}
2727

28-
public static void SetOracleParameters(IDbDataParameter parameter, OracleDynamicParameters.ParamInfo paramInfo)
28+
public static void SetOracleParameters(IDbDataParameter parameter, OracleDynamicParameters.OracleParameterInfo oracleParameterInfo)
2929
{
3030
if (parameter == null)
3131
{
@@ -34,45 +34,73 @@ public static void SetOracleParameters(IDbDataParameter parameter, OracleDynamic
3434

3535
var method = CachedOracleTypes.GetOrAdd(parameter.GetType(), GetOracleProperties);
3636

37-
if (paramInfo.DbType != null)
37+
if (oracleParameterInfo.DbType != null)
3838
{
39-
object value = (int)paramInfo.DbType;
39+
object value = (int)oracleParameterInfo.DbType;
4040
method.OraDbType.SetValue(parameter, value);
4141
}
4242

43-
if (paramInfo.IsNullable.HasValue)
43+
if (oracleParameterInfo.IsNullable.HasValue)
4444
{
45-
method.IsNullable.SetValue(parameter, paramInfo.IsNullable.Value);
45+
method.IsNullable.SetValue(parameter, oracleParameterInfo.IsNullable.Value);
4646
}
4747

48-
if (paramInfo.Scale.HasValue)
48+
if (oracleParameterInfo.Scale.HasValue)
4949
{
50-
method.Scale.SetValue(parameter, paramInfo.Scale.Value);
50+
method.Scale.SetValue(parameter, oracleParameterInfo.Scale.Value);
5151
}
5252

53-
if (paramInfo.Precision.HasValue)
53+
if (oracleParameterInfo.Precision.HasValue)
5454
{
55-
method.Precision.SetValue(parameter, paramInfo.Precision.Value);
55+
method.Precision.SetValue(parameter, oracleParameterInfo.Precision.Value);
5656
}
5757

58-
method.SourceVersion.SetValue(parameter, paramInfo.SourceVersion);
58+
method.SourceVersion.SetValue(parameter, oracleParameterInfo.SourceVersion);
5959

60-
if (paramInfo.SourceColumn != null)
60+
if (oracleParameterInfo.SourceColumn != null)
6161
{
62-
method.SourceColumn.SetValue(parameter, paramInfo.SourceColumn);
62+
method.SourceColumn.SetValue(parameter, oracleParameterInfo.SourceColumn);
6363
}
6464

65-
if (paramInfo.CollectionType != OracleMappingCollectionType.None)
65+
if (oracleParameterInfo.CollectionType != OracleMappingCollectionType.None)
6666
{
67-
method.CollectionType.SetValue(parameter, Enum.Parse(method.OracleCollectionEnumType, paramInfo.CollectionType.ToString()));
67+
method.CollectionType.SetValue(parameter, Enum.Parse(method.OracleCollectionEnumType, oracleParameterInfo.CollectionType.ToString()));
6868
}
6969

70-
if (paramInfo.ArrayBindSize != null)
70+
if (oracleParameterInfo.ArrayBindSize != null)
7171
{
72-
method.ArrayBindSize.SetValue(parameter, paramInfo.ArrayBindSize);
72+
method.ArrayBindSize.SetValue(parameter, oracleParameterInfo.ArrayBindSize);
7373
}
7474
}
7575

76+
internal static OracleDynamicParameters.OracleParameterInfo GetParameterInfo(IDbDataParameter parameter)
77+
{
78+
var method = GetOracleProperties(parameter.GetType());
79+
var paramInfo = new OracleDynamicParameters.OracleParameterInfo();
80+
paramInfo.Name = parameter.ParameterName;
81+
paramInfo.SourceVersion = parameter.SourceVersion;
82+
paramInfo.Precision = parameter.Precision;
83+
paramInfo.Size = parameter.Size;
84+
85+
paramInfo.DbType = (OracleMappingType)Enum.Parse(
86+
typeof(OracleMappingType),
87+
Enum.GetName(method.OracleDbEnumType, method.OraDbType.GetValue(parameter)));
88+
paramInfo.ArrayBindSize = (int[])method.ArrayBindSize.GetValue(parameter);
89+
paramInfo.CollectionType= (OracleMappingCollectionType)Enum.Parse(
90+
typeof(OracleMappingCollectionType),
91+
Enum.GetName(method.OracleCollectionEnumType, method.CollectionType.GetValue(parameter)));
92+
paramInfo.ParameterDirection = parameter.Direction;
93+
paramInfo.IsNullable = parameter.IsNullable;
94+
paramInfo.Scale = parameter.Scale;
95+
paramInfo.SourceColumn = parameter.SourceColumn;
96+
paramInfo.Status = (OracleParameterMappingStatus)Enum.Parse(
97+
typeof(OracleParameterMappingStatus),
98+
Enum.GetName(method.OracleStatusEnumType,method.Status.GetValue(parameter)));
99+
paramInfo.Value = parameter.Value;
100+
101+
return paramInfo;
102+
}
103+
76104
private static OracleParameterProperties GetOracleProperties(Type type)
77105
{
78106
Assembly assembly = type.Assembly;
@@ -86,18 +114,21 @@ private static OracleParameterProperties GetOracleProperties(Type type)
86114
SourceColumn = type.GetProperty("SourceColumn"),
87115
SourceVersion = type.GetProperty("SourceVersion"),
88116
CollectionType = type.GetProperty("CollectionType"),
89-
ArrayBindSize = type.GetProperty("ArrayBindSize")
117+
ArrayBindSize = type.GetProperty("ArrayBindSize"),
118+
Status = type.GetProperty("Status")
90119
};
91120
switch (type.FullName)
92121
{
93122
case "Oracle.DataAccess.Client.OracleParameter":
94123
result.OracleDbEnumType = assembly.GetType("Oracle.DataAccess.Client.OracleDbType");
95124
result.OracleCollectionEnumType = assembly.GetType("Oracle.DataAccess.Client.OracleCollectionType");
125+
result.OracleStatusEnumType = assembly.GetType("Oracle.DataAccess.Client.OracleParameterStatus");
96126
break;
97127

98128
case "Oracle.ManagedDataAccess.Client.OracleParameter":
99-
result.OracleDbEnumType = assembly.GetType("Oracle.DataAccess.Client.OracleDbType");
129+
result.OracleDbEnumType = assembly.GetType("Oracle.ManagedDataAccess.Client.OracleDbType");
100130
result.OracleCollectionEnumType = assembly.GetType("Oracle.ManagedDataAccess.Client.OracleCollectionType");
131+
result.OracleStatusEnumType = assembly.GetType("Oracle.ManagedDataAccess.Client.OracleParameterStatus");
101132
break;
102133
default:
103134
throw new NotSupportedException(
@@ -142,9 +173,14 @@ private class OracleParameterProperties
142173

143174
public PropertyInfo CollectionType { get; set; }
144175

176+
public PropertyInfo Status { get; set; }
177+
145178
public Type OracleDbEnumType { get; set; }
146179

180+
public Type OracleStatusEnumType { get; set; }
181+
147182
public Type OracleCollectionEnumType { get; set; }
183+
148184
}
149185

150186
private class CommandProperties

src/Dapper.Oracle/OracleValueConverter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Text.RegularExpressions;
45

6 Bytes
Binary file not shown.

src/Tests.Dapper.Oracle/OracleDynamicParameterTests.cs

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,7 @@
1111
using Managed = Oracle.ManagedDataAccess.Client;
1212

1313
namespace Tests.Dapper.Oracle
14-
{
15-
internal class OverrideCreateCommand : TestableOracleDynamicParameters
16-
{
17-
public bool wasCalled = false;
18-
protected override void AddParameters(IDbCommand command, SqlMapper.Identity identity)
19-
{
20-
wasCalled = true;
21-
base.AddParameters(command, identity);
22-
}
23-
}
14+
{
2415

2516
internal class TestableOracleDynamicParameters : OracleDynamicParameters
2617
{
@@ -141,32 +132,7 @@ public void WrongTypeConnectionWillThrowException()
141132
testObject.Add("Foo", "Bar");
142133
Action act = () => testObject.AddParam(cmd);
143134
act.Should().Throw<NotSupportedException>();
144-
}
145-
146-
[Theory, MemberData(nameof(OracleDataFixture))]
147-
public void DerivedClassSetAllProperties(IDbCommand cmd, IOracleParameterRetretreiver retreiver)
148-
{
149-
var derived = new OverrideCreateCommand();
150-
151-
derived.Add("Foo", "Bar", OracleMappingType.Varchar2, ParameterDirection.Input, 42, true, 0, 0, "MySource", DataRowVersion.Original);
152-
153-
derived.AddParam(cmd);
154-
cmd.Parameters.Should().HaveCount(1);
155-
156-
derived.wasCalled.Should().BeTrue();
157-
158-
var param = retreiver.GetParameter(cmd.Parameters[0]);
159-
param.ParameterName.Should().Be("Foo");
160-
param.Value.Should().Be("Bar");
161-
param.OracleDbType.Should().Be("Varchar2");
162-
param.Direction.Should().Be(ParameterDirection.Input);
163-
param.Size.Should().Be(42);
164-
param.IsNullable.Should().Be(true);
165-
param.Scale.Should().Be(0);
166-
param.Precision.Should().Be(0);
167-
param.SourceColumn.Should().Be("MySource");
168-
param.SourceVersion.Should().Be(DataRowVersion.Original);
169-
}
135+
}
170136

171137
[Theory, MemberData(nameof(OracleDataFixture))]
172138
public void ArrayBindSizeSet_ValueIsSet(IDbCommand cmd, IOracleParameterRetretreiver retreiver)

src/Tests.Dapper.Oracle/OracleValueConverterTests.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Text;
23
using Dapper.Oracle;
34
using FluentAssertions;
45
using Oracle.DataAccess.Types;
@@ -10,7 +11,7 @@ public class OracleValueConverterTests
1011
{
1112
[Fact]
1213
public void GetOracleStringWithContentReturnsContent()
13-
{
14+
{
1415
var oraString = new OracleString("Foo");
1516
var result = OracleValueConverter.Convert<string>(oraString);
1617
result.Should().Be("Foo");
@@ -26,14 +27,14 @@ public void GetOracleStringAsNullReturnsNull()
2627

2728
[Fact]
2829
public void GetStringAsDbNullReturnsNull()
29-
{
30+
{
3031
var result = OracleValueConverter.Convert<string>(DBNull.Value);
3132
result.Should().BeNull();
3233
}
3334

3435
[Fact]
3536
public void GetNullAsStringReturnsNull()
36-
{
37+
{
3738
var result = OracleValueConverter.Convert<string>(null);
3839
result.Should().BeNull();
3940
}
@@ -57,8 +58,8 @@ public void GetOracleDateTimeReturnsDateTime()
5758
{
5859
var result = OracleValueConverter.Convert<DateTime>(new OracleDate(DateTime.Today));
5960
result.Should().Be(DateTime.Today);
60-
}
61-
62-
61+
}
6362
}
63+
64+
6465
}

0 commit comments

Comments
 (0)