Skip to content

Commit c04bc65

Browse files
committed
ODP.NET provider
1 parent 7f839e5 commit c04bc65

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2818
-308
lines changed

DataCommander/.Net-5.0/DataCommander.Net-5.0.sln

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataCommander.Providers.Ole
5555
EndProject
5656
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataCommander.Providers.SQLite", "Providers\DataCommander.Providers.SQLite\DataCommander.Providers.SQLite.csproj", "{0381F665-EE66-4E83-A4FE-903BC9DAB8FE}"
5757
EndProject
58-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataCommander.Providers.SqlServer", "Providers\DataCommander.Providers.SqlServer\DataCommander.Providers.SqlServer.csproj", "{4E1DF75A-56A0-46CE-BBEE-955011AA349A}"
58+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataCommander.Providers.SqlServer", "Providers\DataCommander.Providers.SqlServer\DataCommander.Providers.SqlServer.csproj", "{4E1DF75A-56A0-46CE-BBEE-955011AA349A}"
5959
EndProject
6060
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataCommander.Providers.SqlServerCe40", "Providers\DataCommander.Providers.SqlServerCe40\DataCommander.Providers.SqlServerCe40.csproj", "{80BB6D36-97B2-4393-929D-0AF5F7A05FFA}"
6161
EndProject
62-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataCommander.Providers.MySql", "Providers\DataCommander.Providers.MySql\DataCommander.Providers.MySql.csproj", "{C088FDA9-7991-41DF-A72D-6B7074AC555B}"
62+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataCommander.Providers.MySql", "Providers\DataCommander.Providers.MySql\DataCommander.Providers.MySql.csproj", "{C088FDA9-7991-41DF-A72D-6B7074AC555B}"
6363
EndProject
6464
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataCommander.Providers.Msi", "Providers\DataCommander.Providers.Msi\DataCommander.Providers.Msi.csproj", "{8321DB29-34C0-4A27-AE1D-C3CE807A9353}"
6565
EndProject
66+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataCommander.Providers.Odp", "Providers\DataCommander.Providers.Odp\DataCommander.Providers.Odp.csproj", "{E6E924FD-41D2-4A5E-909B-AD4BE7AB4084}"
67+
EndProject
6668
Global
6769
GlobalSection(SolutionConfigurationPlatforms) = preSolution
6870
Debug|Any CPU = Debug|Any CPU
@@ -181,6 +183,10 @@ Global
181183
{8321DB29-34C0-4A27-AE1D-C3CE807A9353}.Debug|Any CPU.Build.0 = Debug|Any CPU
182184
{8321DB29-34C0-4A27-AE1D-C3CE807A9353}.Release|Any CPU.ActiveCfg = Release|Any CPU
183185
{8321DB29-34C0-4A27-AE1D-C3CE807A9353}.Release|Any CPU.Build.0 = Release|Any CPU
186+
{E6E924FD-41D2-4A5E-909B-AD4BE7AB4084}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
187+
{E6E924FD-41D2-4A5E-909B-AD4BE7AB4084}.Debug|Any CPU.Build.0 = Debug|Any CPU
188+
{E6E924FD-41D2-4A5E-909B-AD4BE7AB4084}.Release|Any CPU.ActiveCfg = Release|Any CPU
189+
{E6E924FD-41D2-4A5E-909B-AD4BE7AB4084}.Release|Any CPU.Build.0 = Release|Any CPU
184190
EndGlobalSection
185191
GlobalSection(SolutionProperties) = preSolution
186192
HideSolutionNode = FALSE
@@ -211,6 +217,7 @@ Global
211217
{80BB6D36-97B2-4393-929D-0AF5F7A05FFA} = {71C8735D-181F-43FF-8CFF-5DB64B9CC5AE}
212218
{C088FDA9-7991-41DF-A72D-6B7074AC555B} = {71C8735D-181F-43FF-8CFF-5DB64B9CC5AE}
213219
{8321DB29-34C0-4A27-AE1D-C3CE807A9353} = {71C8735D-181F-43FF-8CFF-5DB64B9CC5AE}
220+
{E6E924FD-41D2-4A5E-909B-AD4BE7AB4084} = {71C8735D-181F-43FF-8CFF-5DB64B9CC5AE}
214221
EndGlobalSection
215222
GlobalSection(ExtensibilityGlobals) = postSolution
216223
SolutionGuid = {0C5BD4E9-0123-4824-9688-9D29D59A3FDE}

DataCommander/.Net-5.0/DataCommander/DataCommander.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
<ItemGroup>
1616
<PackageReference Include="Microsoft.Data.SqlClient" Version="3.0.0" />
17+
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.1" />
1718
</ItemGroup>
1819

1920
<ItemGroup>
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
using System;
2+
using System.Data;
3+
using Foundation.Data;
4+
using Oracle.ManagedDataAccess.Client;
5+
6+
namespace DataCommander.Providers.Odp
7+
{
8+
/// <exclude/>
9+
/// <summary>
10+
/// Summary description for CommandBuilder.
11+
/// </summary>
12+
public static class CommandBuilder
13+
{
14+
public static void DeriveParameters(
15+
OracleConnection connection,
16+
string owner,
17+
string packageName,
18+
string objectName,
19+
string overload,
20+
OracleParameterCollection parameters )
21+
{
22+
if (overload == null)
23+
{
24+
overload = "is null";
25+
}
26+
else
27+
{
28+
overload = "= '" + overload + "'";
29+
}
30+
31+
const string format = @"select argument_name,
32+
data_type,
33+
default_value,
34+
in_out,
35+
data_length,
36+
data_precision,
37+
data_scale
38+
from all_arguments a
39+
where owner = '{0}'
40+
and package_name = '{1}'
41+
and object_name = '{2}'
42+
and overload {3}
43+
--and data_level = 0
44+
order by overload,position";
45+
var commandText = string.Format(format, owner, packageName, objectName, overload);
46+
var command = new OracleCommand(commandText, connection);
47+
48+
using (var dataReader = command.ExecuteReader())
49+
{
50+
var first = true;
51+
52+
while (dataReader.Read())
53+
{
54+
var argumentName = dataReader.GetStringOrDefault(0);
55+
var dataType = dataReader.GetString(1);
56+
var inOut = dataReader.GetString(2);
57+
var dataLength = dataReader.GetNullableDecimal(3);
58+
var precision = dataReader.GetNullableDecimal(4);
59+
var scale = dataReader.GetNullableDecimal(5);
60+
ParameterDirection direction;
61+
62+
switch (inOut)
63+
{
64+
case "IN":
65+
direction = ParameterDirection.Input;
66+
break;
67+
68+
case "OUT":
69+
direction = first ? ParameterDirection.ReturnValue : ParameterDirection.Output;
70+
break;
71+
72+
case "IN/OUT":
73+
direction = ParameterDirection.InputOutput;
74+
break;
75+
76+
default:
77+
throw new NotImplementedException();
78+
}
79+
80+
OracleDbType dbType;
81+
82+
switch (dataType)
83+
{
84+
case "CHAR":
85+
dbType = OracleDbType.Char;
86+
break;
87+
88+
case "NUMBER":
89+
dbType = OracleDbType.Decimal;
90+
91+
if (precision == null && scale == null)
92+
{
93+
precision = 38;
94+
scale = 127;
95+
}
96+
97+
break;
98+
99+
case "VARCHAR2":
100+
dbType = OracleDbType.Varchar2;
101+
break;
102+
103+
case "PL/SQL TABLE":
104+
dbType = OracleDbType.RefCursor;
105+
break;
106+
107+
case "BINARY_INTEGER":
108+
// dbType = OracleDbType.Decimal;
109+
//
110+
// if (precision == 0 && scale == 0)
111+
// {
112+
// precision = 38;
113+
// scale = 0;
114+
// }
115+
//
116+
// length = dataReader.IsDBNull(3) ? 22 : Convert.ToInt32(dataReader[3]);
117+
dbType = OracleDbType.Int64;
118+
break;
119+
120+
case "RAW":
121+
dbType = OracleDbType.Raw;
122+
break;
123+
124+
//case "OBJECT":
125+
// dbType = OracleDbType.
126+
// break;
127+
128+
default:
129+
throw new NotImplementedException();
130+
}
131+
132+
var parameter = new OracleParameter
133+
{
134+
ParameterName = argumentName,
135+
Direction = direction,
136+
OracleDbType = dbType,
137+
Size = (int)dataLength.GetValueOrDefault(),
138+
Precision = (byte)precision.GetValueOrDefault(),
139+
Scale = (byte)scale.GetValueOrDefault()
140+
};
141+
142+
parameters.Add( parameter );
143+
144+
if (first)
145+
{
146+
first = false;
147+
}
148+
}
149+
}
150+
}
151+
}
152+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using System.Data;
2+
using System.Text;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using DataCommander.Providers2.Connection;
6+
using Oracle.ManagedDataAccess.Client;
7+
8+
namespace DataCommander.Providers.Odp
9+
{
10+
internal sealed class Connection : ConnectionBase
11+
{
12+
private readonly OracleConnectionStringBuilder _oracleConnectionStringBuilder;
13+
private readonly OracleConnection _oracleConnection;
14+
private string _connectionName;
15+
16+
public Connection(string connectionString)
17+
{
18+
_oracleConnectionStringBuilder = new OracleConnectionStringBuilder(connectionString);
19+
_oracleConnection = new OracleConnection(connectionString);
20+
Connection = _oracleConnection;
21+
_oracleConnection.InfoMessage += OnInfoMessage;
22+
}
23+
24+
public override async Task OpenAsync(CancellationToken cancellationToken)
25+
{
26+
await _oracleConnection.OpenAsync(cancellationToken);
27+
var enlist = bool.Parse(_oracleConnectionStringBuilder.Enlist);
28+
}
29+
30+
public override string Caption
31+
{
32+
get
33+
{
34+
var caption = $"{_oracleConnectionStringBuilder.UserID}@{_oracleConnectionStringBuilder.DataSource}";
35+
return caption;
36+
}
37+
}
38+
39+
private void OnInfoMessage(object sender, OracleInfoMessageEventArgs e)
40+
{
41+
var sb = new StringBuilder();
42+
sb.AppendLine(e.Message);
43+
sb.Append("Source: ");
44+
sb.Append(e.Source);
45+
46+
InvokeInfoMessage(new[] {InfoMessageFactory.Create(InfoMessageSeverity.Information, null, sb.ToString())});
47+
}
48+
49+
public override string ConnectionName
50+
{
51+
get => _connectionName;
52+
set => _connectionName = value;
53+
}
54+
55+
public override string DataSource => _oracleConnection.DataSource;
56+
57+
public override string ServerVersion => _oracleConnection.ServerVersion;
58+
59+
public override IDbCommand CreateCommand()
60+
{
61+
var command = _oracleConnection.CreateCommand();
62+
command.InitialLONGFetchSize = 8 * 1024;
63+
command.FetchSize = 256 * 1024;
64+
return command;
65+
}
66+
67+
protected override void SetDatabase(string database)
68+
{
69+
}
70+
71+
public override int TransactionCount => 0;
72+
}
73+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using DataCommander.Providers2;
2+
using Oracle.ManagedDataAccess.Client;
3+
4+
namespace DataCommander.Providers.Odp
5+
{
6+
internal sealed class ConnectionStringBuilder : IDbConnectionStringBuilder
7+
{
8+
private readonly OracleConnectionStringBuilder _oracleConnectionStringBuilder = new OracleConnectionStringBuilder();
9+
10+
string IDbConnectionStringBuilder.ConnectionString
11+
{
12+
get => _oracleConnectionStringBuilder.ConnectionString;
13+
set => _oracleConnectionStringBuilder.ConnectionString = value;
14+
}
15+
16+
bool IDbConnectionStringBuilder.IsKeywordSupported(string keyword) => false;
17+
bool IDbConnectionStringBuilder.TryGetValue(string keyword, out object value) => _oracleConnectionStringBuilder.TryGetValue(keyword, out value);
18+
void IDbConnectionStringBuilder.SetValue(string keyword, object value) => _oracleConnectionStringBuilder[keyword] = value;
19+
bool IDbConnectionStringBuilder.Remove(string keyword) => _oracleConnectionStringBuilder.Remove(keyword);
20+
}
21+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net5.0-windows</TargetFramework>
5+
<UseWindowsForms>true</UseWindowsForms>
6+
</PropertyGroup>
7+
8+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
9+
<OutputPath>..\..\DataCommander\bin\Debug</OutputPath>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.1" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<ProjectReference Include="..\..\..\..\Foundation\.Net-5.0\Data\Foundation.Data.csproj" />
18+
<ProjectReference Include="..\..\DataCommander.Providers2\DataCommander.Providers2.csproj" />
19+
<ProjectReference Include="..\..\DataCommander.Providers\DataCommander.Providers.csproj" />
20+
</ItemGroup>
21+
22+
</Project>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System;
2+
using DataCommander.Providers2.FieldNamespace;
3+
using Oracle.ManagedDataAccess.Client;
4+
5+
namespace DataCommander.Providers.Odp.DataFieldReader
6+
{
7+
internal sealed class DateTimeDataFieldReader : IDataFieldReader
8+
{
9+
private readonly OracleDataReader _oracleDataReader;
10+
private readonly int _columnOrdinal;
11+
12+
public DateTimeDataFieldReader(
13+
OracleDataReader oracleDataReader,
14+
int columnOrdinal )
15+
{
16+
_oracleDataReader = oracleDataReader;
17+
_columnOrdinal = columnOrdinal;
18+
}
19+
20+
object IDataFieldReader.Value
21+
{
22+
get
23+
{
24+
object value;
25+
26+
if (_oracleDataReader.IsDBNull( _columnOrdinal ))
27+
{
28+
value = DBNull.Value;
29+
}
30+
else
31+
{
32+
var oracleDate = _oracleDataReader.GetOracleDate( _columnOrdinal );
33+
var dateTime = oracleDate.Value;
34+
var dateTimeField = new DateTimeField( dateTime );
35+
value = dateTimeField;
36+
37+
//string format;
38+
39+
//if (dateTime.TimeOfDay.Ticks == 0)
40+
//{
41+
// format = "yyyy-MM-dd";
42+
//}
43+
//else if (dateTime.Date.Ticks == 0)
44+
//{
45+
// format = "HH:mm:ss";
46+
//}
47+
//else
48+
//{
49+
// format = "yyyy-MM-dd HH:mm:ss";
50+
//}
51+
52+
//value = dateTime.ToString( format );
53+
}
54+
55+
return value;
56+
}
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)