aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlRow.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlRow.cs')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlRow.cs153
1 files changed, 153 insertions, 0 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlRow.cs b/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlRow.cs
new file mode 100644
index 000000000..dfabacfea
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlRow.cs
@@ -0,0 +1,153 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.BL.Entities;
+
+namespace Tango.PPC.Shared.SQL
+{
+ /// <summary>
+ /// Represents a <see cref="RemoteSqlDataSet"/> row.
+ /// </summary>
+ /// <example>
+ /// <para>
+ /// <i>
+ /// The following example demonstrates how to set the connected machine's demo state and query for the connected machine's jobs.
+ /// </i>
+ /// </para>
+ /// <code lang="C#" source="../Tango.FSE.Procedures/Examples/Sql/Program.cs" title="Remote SQL" region="Example" />
+ /// </example>
+ public class RemoteSqlRow
+ {
+ private Func<String, Object> _getFuncKey;
+ private Func<int, Object> _getFuncIndex;
+
+ /// <summary>
+ /// Gets or sets the row values.
+ /// </summary>
+ public List<Object> Values { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="RemoteSqlRow"/> class.
+ /// </summary>
+ public RemoteSqlRow()
+ {
+ Values = new List<object>();
+ }
+
+ /// <summary>
+ /// Gets a row value by its column name.
+ /// </summary>
+ /// <param name="columnName">Name of the column.</param>
+ /// <returns>The column value.</returns>
+ public Object Get(String columnName)
+ {
+ return _getFuncKey.Invoke(columnName);
+ }
+
+ /// <summary>
+ /// Gets a row value by its column index.
+ /// </summary>
+ /// <param name="columnIndex">Index of the column.</param>
+ /// <returns>The column value.</returns>
+ public Object Get(int columnIndex)
+ {
+ return _getFuncIndex.Invoke(columnIndex);
+ }
+
+ /// <summary>
+ /// Gets a row value as type T by its column name.
+ /// </summary>
+ /// <typeparam name="T">Expected column type.</typeparam>
+ /// <param name="columnName">Name of the column.</param>
+ /// <returns>The column value.</returns>
+ public T Get<T>(String columnName)
+ {
+ var value = _getFuncKey.Invoke(columnName);
+
+ if (typeof(T) != value.GetType())
+ {
+ return (T)Convert.ChangeType(value, typeof(T));
+ }
+ else
+ {
+ return (T)value;
+ }
+ }
+
+ /// <summary>
+ /// Gets a row value by its column index.
+ /// </summary>
+ /// <typeparam name="T">Expected column type</typeparam>
+ /// <param name="columnIndex">Index of the column.</param>
+ /// <returns>The column value.</returns>
+ public T Get<T>(int columnIndex)
+ {
+ var value = _getFuncIndex.Invoke(columnIndex);
+
+ if (typeof(T) != value.GetType())
+ {
+ return (T)Convert.ChangeType(value, typeof(T));
+ }
+ else
+ {
+ return (T)value;
+ }
+ }
+
+ internal void Init(Func<String, Object> getFuncKey, Func<int, Object> getFuncIndex)
+ {
+ _getFuncKey = getFuncKey;
+ _getFuncIndex = getFuncIndex;
+ }
+
+ /// <summary>
+ /// Returns a <see cref="System.String" /> that represents this instance.
+ /// </summary>
+ /// <returns>
+ /// A <see cref="System.String" /> that represents this instance.
+ /// </returns>
+ public override string ToString()
+ {
+ return String.Join(", ", Values);
+ }
+
+ /// <summary>
+ /// Creates an object of type T and maps this row to it based on its properties decorated with <see cref="ColumnAttribute"/>.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns></returns>
+ public T Map<T>() where T : class, new()
+ {
+ var obj = Activator.CreateInstance<T>();
+ Map<T>(obj);
+ return obj;
+ }
+
+ /// <summary>
+ /// Maps this row to the specified object based on its properties decorated with <see cref="ColumnAttribute"/>.
+ /// </summary>
+ /// <typeparam name="T">Model type</typeparam>
+ /// <param name="obj">The object.</param>
+ public void Map<T>(T obj) where T : class
+ {
+ foreach (var prop in typeof(T).GetPropertiesWithAttribute<ColumnAttribute>())
+ {
+ try
+ {
+ var columnName = prop.GetCustomAttribute<ColumnAttribute>().Name;
+ var value = Get(columnName).ToStringSafe();
+ prop.SetValue(obj, Convert.ChangeType(value, prop.PropertyType));
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine(ex);
+ }
+ }
+ }
+ }
+}