aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlDataSet.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlDataSet.cs')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlDataSet.cs153
1 files changed, 153 insertions, 0 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlDataSet.cs b/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlDataSet.cs
new file mode 100644
index 000000000..089908e5a
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Shared/SQL/RemoteSqlDataSet.cs
@@ -0,0 +1,153 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+using System.Data.SqlClient;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.PPC.Shared.SQL
+{
+ public class RemoteSqlDataSet
+ {
+ public RemoteSqlColumnCollection Columns { get; set; }
+
+ private ObservableCollection<RemoteSqlRow> _rows;
+ public ObservableCollection<RemoteSqlRow> Rows
+ {
+ get { return _rows; }
+ set { _rows = value; OnRowsChanged(); }
+ }
+
+ public RemoteSqlDataSet()
+ {
+ Columns = new RemoteSqlColumnCollection();
+ Rows = new ObservableCollection<RemoteSqlRow>();
+ }
+
+ private void OnRowsChanged()
+ {
+ if (Rows != null)
+ {
+ Rows.CollectionChanged -= Rows_CollectionChanged;
+ Rows.CollectionChanged += Rows_CollectionChanged;
+
+ InitRows();
+ }
+ }
+
+ private void Rows_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+ {
+ InitRows();
+ }
+
+ private void InitRows()
+ {
+ if (Rows != null)
+ {
+ foreach (var row in Rows.ToList())
+ {
+ row.Init(
+ (key) =>
+ {
+ return row.Values[Columns.GetIndexOf(key)];
+ },
+ (index) =>
+ {
+ return row.Values[index];
+ });
+ }
+ }
+ }
+
+ public static Task<RemoteSqlDataSet> Load(SqlDataReader reader)
+ {
+ return Task.Factory.StartNew<RemoteSqlDataSet>(() =>
+ {
+ bool columnsRead = false;
+ RemoteSqlDataSet dataSet = new RemoteSqlDataSet();
+
+ try
+ {
+ while (reader.Read())
+ {
+ RemoteSqlRow row = new RemoteSqlRow();
+
+ for (int i = 0; i < reader.FieldCount; i++)
+ {
+ if (!columnsRead)
+ {
+ dataSet.Columns.Add(new RemoteSqlColumn()
+ {
+ Name = reader.GetName(i)
+ });
+ }
+
+ row.Values.Add(reader.GetValue(i));
+ }
+
+ columnsRead = true;
+ dataSet.Rows.Add(row);
+ }
+ }
+ finally
+ {
+ reader.Close();
+ }
+
+ return dataSet;
+ });
+ }
+
+ public override string ToString()
+ {
+ return String.Join(", ", Columns.Select(x => x.Name)) + "\n" + String.Join(Environment.NewLine, Rows.Select(x => x.ToString()));
+ }
+
+ public String ToTableString()
+ {
+ Dictionary<int, int> columnsMaxLength = new Dictionary<int, int>();
+
+ for (int i = 0; i < Columns.Count; i++)
+ {
+ columnsMaxLength.Add(i, Columns[i].Name.Length);
+ }
+
+ foreach (var row in Rows)
+ {
+ for (int i = 0; i < row.Values.Count; i++)
+ {
+ int valueLength = row.Values[i].ToStringSafe().Length;
+
+ if (valueLength > columnsMaxLength[i])
+ {
+ columnsMaxLength[i] = valueLength;
+ }
+ }
+ }
+
+ String str = String.Empty;
+
+ for (int i = 0; i < Columns.Count; i++)
+ {
+ str += $"{Columns[i].Name.PadRight(columnsMaxLength[i])}{(i < Columns.Count - 1 ? " | " : "")}";
+ }
+
+ int width = str.Length;
+ str += Environment.NewLine + String.Empty.PadRight(width, '-');
+
+ foreach (var row in Rows)
+ {
+ str += Environment.NewLine;
+
+ for (int i = 0; i < row.Values.Count; i++)
+ {
+ str += $"{row.Values[i].ToStringSafe().PadRight(columnsMaxLength[i])}{(i < Columns.Count - 1 ? " | " : "")}";
+ }
+ }
+
+ return str;
+ }
+ }
+}