|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
3 | | -using System.Data; |
4 | | -using System.Globalization; |
5 | 3 | using System.Linq; |
6 | | -using System.Numerics; |
7 | 4 | using DuckDB.NET.Data.Extensions; |
8 | 5 | using DuckDB.NET.Native; |
9 | 6 |
|
10 | 7 | namespace DuckDB.NET.Data.Internal; |
11 | 8 |
|
12 | 9 | internal sealed class PreparedStatement : IDisposable |
13 | 10 | { |
14 | | - private static readonly Dictionary<DbType, Func<object, DuckDBValue>> ValueCreators = new() |
15 | | - { |
16 | | - { DbType.Guid, value => |
17 | | - { |
18 | | - using var handle = value.ToString().ToUnmanagedString(); |
19 | | - return NativeMethods.Value.DuckDBCreateVarchar(handle); |
20 | | - } |
21 | | - }, |
22 | | - { DbType.Currency, value => |
23 | | - { |
24 | | - using var handle = ((decimal)value).ToString(CultureInfo.InvariantCulture).ToUnmanagedString(); |
25 | | - return NativeMethods.Value.DuckDBCreateVarchar(handle); |
26 | | - } |
27 | | - }, |
28 | | - { DbType.Boolean, value => NativeMethods.Value.DuckDBCreateBool((bool)value) }, |
29 | | - { DbType.SByte, value => NativeMethods.Value.DuckDBCreateInt8((sbyte)value) }, |
30 | | - { DbType.Int16, value => NativeMethods.Value.DuckDBCreateInt16((short)value) }, |
31 | | - { DbType.Int32, value => NativeMethods.Value.DuckDBCreateInt32((int)value) }, |
32 | | - { DbType.Int64, value => NativeMethods.Value.DuckDBCreateInt64((long)value) }, |
33 | | - { DbType.Byte, value => NativeMethods.Value.DuckDBCreateUInt8((byte)value) }, |
34 | | - { DbType.UInt16, value => NativeMethods.Value.DuckDBCreateUInt16((ushort)value) }, |
35 | | - { DbType.UInt32, value => NativeMethods.Value.DuckDBCreateUInt32((uint)value) }, |
36 | | - { DbType.UInt64, value => NativeMethods.Value.DuckDBCreateUInt64((ulong)value) }, |
37 | | - { DbType.Single, value => NativeMethods.Value.DuckDBCreateFloat((float)value) }, |
38 | | - { DbType.Double, value => NativeMethods.Value.DuckDBCreateDouble((double)value) }, |
39 | | - { DbType.String, value => |
40 | | - { |
41 | | - using var handle = ((string)value).ToUnmanagedString(); |
42 | | - return NativeMethods.Value.DuckDBCreateVarchar(handle); |
43 | | - } |
44 | | - }, |
45 | | - { DbType.VarNumeric, value => NativeMethods.Value.DuckDBCreateHugeInt(new((BigInteger)value)) }, |
46 | | - { DbType.Binary, value => |
47 | | - { |
48 | | - var bytes = (byte[])value; |
49 | | - return NativeMethods.Value.DuckDBCreateBlob(bytes, bytes.Length); |
50 | | - } |
51 | | - }, |
52 | | - { DbType.Date, value => |
53 | | - { |
54 | | -#if NET6_0_OR_GREATER |
55 | | - var date = NativeMethods.DateTimeHelpers.DuckDBToDate(value is DateOnly dateOnly ? (DuckDBDateOnly)dateOnly : (DuckDBDateOnly)value); |
56 | | -#else |
57 | | - var date = NativeMethods.DateTimeHelpers.DuckDBToDate((DuckDBDateOnly)value); |
58 | | -#endif |
59 | | - return NativeMethods.Value.DuckDBCreateDate(date); |
60 | | - } |
61 | | - }, |
62 | | - { DbType.Time, value => |
63 | | - { |
64 | | -#if NET6_0_OR_GREATER |
65 | | - var time = NativeMethods.DateTimeHelpers.DuckDBToTime(value is TimeOnly timeOnly ? (DuckDBTimeOnly)timeOnly : (DuckDBTimeOnly)value); |
66 | | -#else |
67 | | - var time = NativeMethods.DateTimeHelpers.DuckDBToTime((DuckDBTimeOnly)value); |
68 | | -#endif |
69 | | - return NativeMethods.Value.DuckDBCreateTime(time); |
70 | | - } |
71 | | - }, |
72 | | - { DbType.DateTime, value => |
73 | | - { |
74 | | - var timestamp = DuckDBTimestamp.FromDateTime((DateTime)value); |
75 | | - var timestampStruct = NativeMethods.DateTimeHelpers.DuckDBToTimestamp(timestamp); |
76 | | - return NativeMethods.Value.DuckDBCreateTimestamp(timestampStruct); |
77 | | - } |
78 | | - }, |
79 | | - }; |
80 | | - |
81 | 11 | private readonly DuckDBPreparedStatement statement; |
82 | 12 |
|
83 | 13 | private PreparedStatement(DuckDBPreparedStatement statement) |
@@ -119,7 +49,7 @@ public static IEnumerable<DuckDBResult> PrepareMultiple(DuckDBNativeConnection c |
119 | 49 | } |
120 | 50 | } |
121 | 51 |
|
122 | | - public DuckDBResult Execute(DuckDBParameterCollection parameterCollection, bool useStreamingMode) |
| 52 | + private DuckDBResult Execute(DuckDBParameterCollection parameterCollection, bool useStreamingMode) |
123 | 53 | { |
124 | 54 | BindParameters(statement, parameterCollection); |
125 | 55 |
|
@@ -186,15 +116,9 @@ private static void BindParameter(DuckDBPreparedStatement preparedStatement, lon |
186 | 116 | return; |
187 | 117 | } |
188 | 118 |
|
189 | | - // if (!ValueCreators.TryGetValue(parameter.DbType, out var func)) |
190 | | - // { |
191 | | - // throw new InvalidOperationException($"Unable to bind value of type {parameter.DbType}."); |
192 | | - // } |
193 | | - |
194 | | - var duckDBValue2 = parameter.Value!.ToDuckDBValue(); |
| 119 | + using var duckDBValue = parameter.Value!.ToDuckDBValue(); |
195 | 120 |
|
196 | | - //using var duckDBValue = func(parameter.Value!); |
197 | | - var result = NativeMethods.PreparedStatements.DuckDBBindValue(preparedStatement, index, duckDBValue2); |
| 121 | + var result = NativeMethods.PreparedStatements.DuckDBBindValue(preparedStatement, index, duckDBValue); |
198 | 122 |
|
199 | 123 | if (!result.IsSuccess()) |
200 | 124 | { |
|
0 commit comments