generated from Avanade/avanade-template
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathDatabaseRecord.cs
94 lines (83 loc) · 4.04 KB
/
DatabaseRecord.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/CoreEx
using CoreEx.Entities;
using System;
using System.Data.Common;
namespace CoreEx.Database
{
/// <summary>
/// Encapsulates the <see cref="DbDataReader"/> to provide requisite column value capabilities.
/// </summary>
/// <param name="database">The owning <see cref="IDatabase"/>.</param>
/// <param name="dataReader">The underlying <see cref="DbDataReader"/>.</param>
public class DatabaseRecord(IDatabase database, DbDataReader dataReader)
{
/// <summary>
/// Gets the underlying <see cref="IDatabase"/>.
/// </summary>
public IDatabase Database { get; } = database.ThrowIfNull(nameof(database));
/// <summary>
/// Gets the underlying <see cref="DbDataReader"/>.
/// </summary>
public DbDataReader DataReader { get; } = dataReader.ThrowIfNull(nameof(dataReader));
/// <summary>
/// Gets the named column value.
/// </summary>
/// <param name="columnName">The column name.</param>
/// <returns>The value.</returns>
public object? GetValue(string columnName) => GetValue(DataReader.GetOrdinal(columnName.ThrowIfNull(nameof(columnName))));
/// <summary>
/// Gets the specified column value.
/// </summary>
/// <param name="ordinal">The ordinal index.</param>
/// <returns>The value.</returns>
public object? GetValue(int ordinal)
{
if (DataReader.IsDBNull(ordinal))
return default;
var val = DataReader.GetValue(ordinal);
return val is DateTime dt ? Cleaner.Clean(dt, Database.DateTimeTransform) : val;
}
/// <summary>
/// Gets the named column value.
/// </summary>
/// <typeparam name="T">The value <see cref="Type"/>.</typeparam>
/// <param name="columnName">The column name.</param>
/// <returns>The value.</returns>
public T GetValue<T>(string columnName) => GetValue<T>(DataReader.GetOrdinal(columnName.ThrowIfNull(nameof(columnName))));
/// <summary>
/// Gets the specified column value.
/// </summary>
/// <typeparam name="T">The value <see cref="Type"/>.</typeparam>
/// <param name="ordinal">The ordinal index.</param>
/// <returns>The value.</returns>
public T GetValue<T>(int ordinal)
{
if (DataReader.IsDBNull(ordinal))
return default!;
T val = DataReader.GetFieldValue<T>(ordinal);
return val is DateTime dt ? (T)Convert.ChangeType(Cleaner.Clean(dt, Database.DateTimeTransform), typeof(DateTime), System.Globalization.CultureInfo.InvariantCulture) : val;
}
/// <summary>
/// Indicates whether the named column is <see cref="DBNull"/>.
/// </summary>
/// <param name="columnName">The column name.</param>
/// <param name="ordinal">The corresponding ordinal for the column name.</param>
/// <returns><c>true</c> indicates that the column value has a <see cref="DBNull"/> value; otherwise, <c>false</c>.</returns>
public bool IsDBNull(string columnName, out int ordinal)
{
ordinal = DataReader.GetOrdinal(columnName.ThrowIfNull(nameof(columnName)));
return DataReader.IsDBNull(ordinal);
}
/// <summary>
/// Gets the named <c>RowVersion</c> column as a <see cref="string"/>.
/// </summary>
/// <param name="columnName">The name of the column.</param>
/// <returns>The resultant value.</returns>
/// <remarks>The <b>RowVersion</b> column will be converted to a <see cref="string"/> using the <see cref="IDatabase.RowVersionConverter"/>.</remarks>
public string GetRowVersion(string columnName)
{
var i = DataReader.GetOrdinal(columnName.ThrowIfNull(nameof(columnName)));
return (string)(Database.RowVersionConverter.ConvertToSource(DataReader.GetFieldValue<byte[]>(i)) ?? string.Empty);
}
}
}