Skip to content

Commit be39688

Browse files
committed
Use OracleVector for Oracle instead of just array to support cleaer typing scenarios
1 parent cecb449 commit be39688

3 files changed

Lines changed: 17 additions & 10 deletions

File tree

src/RepoDb.Oracle/DbHelpers/OracleDbHelper.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ private static IEnumerable<DbSchemaObject> MapSchemaQueryResult((string Type, st
217217

218218
public override object? ParameterValueToDb(object? value, IDbDataParameter parameter)
219219
{
220-
switch(value)
220+
switch (value)
221221
{
222222
#if NET
223223
case DateOnly dateOnly:
@@ -226,12 +226,15 @@ private static IEnumerable<DbSchemaObject> MapSchemaQueryResult((string Type, st
226226
case TimeOnly to:
227227
return to.ToTimeSpan();
228228
#endif
229-
case float[]:
230-
(parameter as OracleParameter)?.OracleDbType = OracleDbType.Vector_Float32;
229+
case OracleVector vector:
230+
(parameter as OracleParameter)?.OracleDbType = vector.ProviderType;
231231
return value;
232-
case double[]:
232+
case float[] floats:
233+
(parameter as OracleParameter)?.OracleDbType = OracleDbType.Vector_Float32;
234+
return new OracleVector(floats);
235+
case double[] doubles:
233236
(parameter as OracleParameter)?.OracleDbType = OracleDbType.Vector_Float64;
234-
return value;
237+
return new OracleVector(doubles);
235238
default:
236239
return base.ParameterValueToDb(value, parameter);
237240
}
@@ -384,11 +387,14 @@ public override DbRuntimeSetting GetDbConnectionRuntimeInformation(IDbConnection
384387

385388
static OracleDbHelper()
386389
{
387-
ProviderSpecificTypeTransforms.TryAdd((typeof(ReadOnlyMemory<float>), typeof(float[])),
388-
(fromExpr) => Expression.Convert(Expression.Call(fromExpr, "ToArray", null, []), typeof(float[]))
390+
ProviderSpecificTypeTransforms.TryAdd((typeof(ReadOnlyMemory<float>), typeof(OracleVector)),
391+
(fromExpr) => Expression.New(typeof(OracleVector).GetConstructor(new[] { typeof(float[]) })!, [Expression.Convert(Expression.Call(fromExpr, "ToArray", null, []), typeof(float[]))])
392+
);
393+
ProviderSpecificTypeTransforms.TryAdd((typeof(OracleVector), typeof(ReadOnlyMemory<float>)),
394+
(fromExpr) => Expression.New(typeof(ReadOnlyMemory<float>).GetConstructor(new[] { typeof(float[]) })!, [Expression.Call(fromExpr, typeof(OracleVector).GetMethod(nameof(OracleVector.ToFloatArray))!, [])])
389395
);
390396
ProviderSpecificTypeTransforms.TryAdd((typeof(float[]), typeof(ReadOnlyMemory<float>)),
391-
(fromExpr) => Expression.New(typeof(ReadOnlyMemory<float>).GetConstructor(new[] { typeof(float[]) })!, [ fromExpr ])
397+
(fromExpr) => Expression.New(typeof(ReadOnlyMemory<float>).GetConstructor(new[] { typeof(float[]) })!, [fromExpr])
392398
);
393399
}
394400
}

src/RepoDb.Oracle/Resolvers/OracleDbTypeToClientTypeResolver.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Text.RegularExpressions;
2+
using Oracle.ManagedDataAccess.Types;
23
using RepoDb.Interfaces;
34

45
namespace RepoDb.Resolvers;
@@ -71,7 +72,7 @@ public Type Resolve(string dbTypeName)
7172
// JSON (Oracle 21c+ supports JSON natively as datatype)
7273
"json" => typeof(string),
7374

74-
"vector" => typeof(float[]), // Oracle 21c+ supports vector types for AI/ML workloads
75+
"vector" => typeof(OracleVector), // Oracle 21c+ supports vector types for AI/ML workloads
7576

7677
// Defaults
7778
_ when RemoveParens.IsMatch(dbTypeName) => Resolve(RemoveParens.Replace(dbTypeName, "")),

src/RepoDb/Extensions/DbCommandExtension.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ private static bool AutomaticConvert(DbField? dbField,
876876
}
877877
else if (fromType == StaticType.Guid && targetType == StaticType.String)
878878
{
879-
return AutomaticConvertGuidToString(value);
879+
return value?.ToString();
880880
}
881881
else if (fromType == StaticType.DateTimeOffset && targetType == StaticType.DateTime && value is DateTimeOffset dto)
882882
{

0 commit comments

Comments
 (0)