diff --git a/ENI2/Controls/MaerskListControl.xaml b/ENI2/Controls/MaerskListControl.xaml
index acb952e8..4369abde 100644
--- a/ENI2/Controls/MaerskListControl.xaml
+++ b/ENI2/Controls/MaerskListControl.xaml
@@ -46,20 +46,45 @@
+ SelectionMode="Extended" AutoGenerateColumns="False" CellEditEnding="dataGridPOCores_CellEditEnding" CanUserAddRows="False">
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ENI2/Controls/MaerskListControl.xaml.cs b/ENI2/Controls/MaerskListControl.xaml.cs
index 648cf13e..f085d15e 100644
--- a/ENI2/Controls/MaerskListControl.xaml.cs
+++ b/ENI2/Controls/MaerskListControl.xaml.cs
@@ -15,6 +15,7 @@ using System.Runtime.InteropServices;
using bsmd.database;
using ExcelDataReader;
+using System.Collections.ObjectModel;
namespace ENI2.Controls
{
@@ -28,6 +29,8 @@ namespace ENI2.Controls
private List searchResult = new List();
private readonly List filteredResult = new List();
+ private readonly ObservableCollection maerskDataList = new ObservableCollection();
+ private const uint MAX_EMPTY_ROWS_ON_IMPORT = 3; // import breaks if more than this count of empty rows have been read
#endregion
@@ -47,11 +50,12 @@ namespace ENI2.Controls
private void POList_Loaded(object sender, RoutedEventArgs e)
{
-
+ dataGridPOCores.ItemsSource = maerskDataList;
}
private void dataGridPOCores_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
+ /*
if (e.EditAction == DataGridEditAction.Commit)
{
if (e.Column == gridColumnPONumber)
@@ -103,8 +107,9 @@ namespace ENI2.Controls
el.Text = string.Empty;
e.Cancel = true;
}
- }
+ }
}
+ */
}
#endregion
@@ -136,7 +141,22 @@ namespace ENI2.Controls
this.dataGridPOCores.SelectedItem = null;
this.filteredResult.AddRange(searchResult);
- this.dataGridPOCores.ItemsSource = this.filteredResult;
+
+ }
+
+ private string ReadFieldAsString(IExcelDataReader reader, int fieldNum)
+ {
+ if (fieldNum >= reader.FieldCount) return null;
+ if (reader.GetFieldType(fieldNum) == typeof(string))
+ return reader.GetString(fieldNum).Clean();
+ if (reader.GetFieldType(fieldNum) == typeof(DateTime))
+ return reader.GetDateTime(fieldNum).ToString();
+ if (reader.GetFieldType(fieldNum) == typeof(int))
+ return reader.GetInt32(fieldNum).ToString();
+ if (reader.GetFieldType(fieldNum) == typeof(double))
+ return ((int) reader.GetDouble(fieldNum)).ToString();
+ Type theType = reader.GetFieldType(fieldNum);
+ return null;
}
#endregion
@@ -160,7 +180,7 @@ namespace ENI2.Controls
FileStream stream;
try
{
- stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read);
+ stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (Exception ex)
{
@@ -170,40 +190,40 @@ namespace ENI2.Controls
using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
{
- List importCores = new List();
+ List importData = new List();
+ uint emptyRowCnt = 0;
try
{
- do
+ while (reader.Read())
{
- while (reader.Read())
+ if (reader.FieldCount < 13)
{
- if (reader.FieldCount < 13)
- {
- throw new InvalidDataException("Sheet must have 13 columns of data");
- }
- MessageCore core = new MessageCore();
- if (reader.IsDBNull(0) && reader.IsDBNull(1)) continue;
- /*
- if (!reader.IsDBNull(0)) crew.CrewMemberLastName = reader.GetString(0).Clean();
-
- if (crew.CrewMemberLastName.Equals("Family Name") || (crew.CrewMemberLastName.Trim().Length == 0)) continue;
- if (!reader.IsDBNull(1)) crew.CrewMemberFirstName = reader.GetString(1).Clean();
- if (!reader.IsDBNull(2)) crew.CrewMemberGender = GlobalStructures.ParseGender(reader.GetString(2));
- if (!reader.IsDBNull(3)) crew.CrewMemberDuty = reader.GetString(3).Clean();
- if (!reader.IsDBNull(4)) crew.CrewMemberNationality = reader.GetString(4).Substring(0, 2).ToUpper();
- if (!reader.IsDBNull(5)) crew.CrewMemberPlaceOfBirth = reader.GetString(5).Clean();
- if (!reader.IsDBNull(6)) crew.CrewMemberCountryOfBirth = reader.GetString(6).Substring(0, 2).ToUpper();
- if (!reader.IsDBNull(7)) crew.CrewMemberDateOfBirth = reader.GetDateTime(7);
- if (!reader.IsDBNull(8)) crew.CrewMemberIdentityDocumentType = GlobalStructures.ReadIdentityDocumentType(reader.GetString(8));
- if (!reader.IsDBNull(9)) crew.CrewMemberIdentityDocumentId = this.getValueAsString(reader, 9).Clean();
- if (!reader.IsDBNull(10)) crew.CrewMemberIdentityDocumentIssuingState = reader.GetString(10).Substring(0, 2).ToUpper();
- if (!reader.IsDBNull(11)) crew.CrewMemberIdentityDocumentExpiryDate = reader.GetDateTime(11);
- if (!reader.IsDBNull(12)) crew.CrewMemberVisaNumber = this.getValueAsString(reader, 12).Clean();
- */
- importCores.Add(core);
+ throw new InvalidDataException("Sheet must have 13 columns of data");
}
- } while (reader.NextResult());
+
+ MaerskData md = new MaerskData();
+ md.ColA = ReadFieldAsString(reader, 0);
+ if (!reader.IsDBNull(1)) md.ColB = ReadFieldAsString(reader, 1);
+ if (!reader.IsDBNull(2)) md.ColC = ReadFieldAsString(reader, 2);
+ if (!reader.IsDBNull(3)) md.ColD = ReadFieldAsString(reader, 3);
+ if (!reader.IsDBNull(4)) md.ColE = ReadFieldAsString(reader, 4);
+ if (!reader.IsDBNull(5)) md.ColF = ReadFieldAsString(reader, 5);
+ if (!reader.IsDBNull(6)) md.ColG = ReadFieldAsString(reader, 6);
+ if (!reader.IsDBNull(7)) md.ColH = ReadFieldAsString(reader, 7);
+ if (!reader.IsDBNull(8)) md.ColI = ReadFieldAsString(reader, 8);
+ if (!reader.IsDBNull(9)) md.ColJ = ReadFieldAsString(reader, 9);
+ if (!reader.IsDBNull(10)) { md.ETA = reader.GetDateTime(10); md.ColK = md.ETA.ToString(); }
+ if (!reader.IsDBNull(11)) md.ColL = ReadFieldAsString(reader, 11);
+ if (!reader.IsDBNull(12)) md.ColM = ReadFieldAsString(reader, 12);
+ if (!reader.IsDBNull(13)) md.Remark = ReadFieldAsString(reader, 13);
+
+ if (!md.ColF.IsNullOrEmpty()) // only add this if IMO is set
+ importData.Add(md);
+ else
+ emptyRowCnt++;
+ if (emptyRowCnt > MAX_EMPTY_ROWS_ON_IMPORT) break;
+ }
}
catch (Exception ex)
{
@@ -211,11 +231,21 @@ namespace ENI2.Controls
}
// we only want cores for the next 3 days
- if (importCores.Count > 0)
+ if (importData.Count > 0)
{
-
+ // TODO: find matching message cores..
}
+
+ // sort
+ // importData.Sort((x, y) => DateTime.Compare(x.ETA ?? DateTime.MaxValue, y.ETA ?? DateTime.MaxValue));
+
+ // merge the result into our grid data source list
+ // TODO
+
+ foreach (MaerskData md in importData)
+ maerskDataList.Add(md);
+ this.dataGridPOCores.Items.Refresh();
}
stream.Close();
diff --git a/SQL/table.XtraData.eni.7.9.sql b/SQL/table.XtraData.eni.7.9.sql
new file mode 100644
index 00000000..53dec4f1
--- /dev/null
+++ b/SQL/table.XtraData.eni.7.9.sql
@@ -0,0 +1,30 @@
+CREATE TABLE [dbo].[XtraData]
+(
+ [Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
+ [ParentId] UNIQUEIDENTIFIER NULL,
+ [ReferenceId] UNIQUEIDENTIFIER NOT NULL,
+ [Field1] NVARCHAR(100) NULL,
+ [Field2] NVARCHAR(100) NULL,
+ [Field3] NVARCHAR(100) NULL,
+ [Field4] NVARCHAR(100) NULL,
+ [Field5] NVARCHAR(100) NULL,
+ [Field6] NVARCHAR(100) NULL,
+ [Field7] NVARCHAR(100) NULL,
+ [Field8] NVARCHAR(100) NULL,
+ [Field9] NVARCHAR(100) NULL,
+ [Field10] NVARCHAR(100) NULL,
+ [Field11] NVARCHAR(100) NULL,
+ [Field12] NVARCHAR(100) NULL,
+ [Field13] NVARCHAR(100) NULL,
+ [Field14] NVARCHAR(100) NULL,
+ [Field15] NVARCHAR(100) NULL,
+ [Field16] NVARCHAR(100) NULL,
+ [Field17] NVARCHAR(100) NULL,
+ [Field18] NVARCHAR(100) NULL,
+ [Field19] NVARCHAR(100) NULL,
+ [Field20] NVARCHAR(100) NULL
+)
+
+GO
+
+CREATE INDEX [IX_XtraData_RefId] ON [dbo].[XtraData] ([ReferenceId])
diff --git a/bsmd.database/DBManager.cs b/bsmd.database/DBManager.cs
index b10acfb1..35dded31 100644
--- a/bsmd.database/DBManager.cs
+++ b/bsmd.database/DBManager.cs
@@ -29,12 +29,11 @@ namespace bsmd.database
private static DBManager _instance;
private static readonly ILog _log = LogManager.GetLogger(typeof(DBManager));
private static Dictionary allReportingParties;
- private static Dictionary allPortAreas;
+ private static Dictionary allPortAreas;
private readonly object _lock = new object();
private bool _closeConnectionAfterUse = false;
private readonly List truncatedFieldCollection = new List();
private Dictionary messageHistoryTypeDict;
- private readonly SemaphoreSlim _asyncSemaphore = new SemaphoreSlim(1);
#endregion
@@ -802,14 +801,7 @@ namespace bsmd.database
if ((this._con == null) ||
(this._con.State == ConnectionState.Closed))
this.Connect(this.ConnectionString);
- }
-
- private async Task CheckConnectionAsync()
- {
- if ((this._con == null) ||
- (this._con.State == ConnectionState.Closed))
- await this.ConnectAsync(this.ConnectionString);
- }
+ }
private void LogNonQueryResult(string query, int queryResult)
{
@@ -1620,7 +1612,7 @@ namespace bsmd.database
{
this.CheckConnection();
cmd.Connection = this._con;
- result = (bool?)cmd.ExecuteScalar();
+ result = (bool?)cmd.ExecuteScalar();
}
catch (SqlException ex)
{
@@ -1688,41 +1680,7 @@ namespace bsmd.database
}
}
- #endregion
-
- #region async DB access methods
-
- internal async Task PerformCommandAsync(SqlCommand cmd)
- {
- SqlDataReader reader = null;
-
- await _asyncSemaphore.WaitAsync();
- try
- {
- await this.CheckConnectionAsync();
- cmd.Connection = this._con;
- reader = await cmd.ExecuteReaderAsync();
- }
- catch (SqlException ex)
- {
- Trace.WriteLine("SQL Exception:" + ex.Message);
- _log.Error("Error performing command", ex);
- _log.DebugFormat("Query: {0}", cmd.CommandText);
- _log.Debug("Parameters:");
- for (int i = 0; i < cmd.Parameters.Count; i++)
- {
- _log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
- }
- }
- finally
- {
- _asyncSemaphore.Release();
- }
-
- return reader;
- }
-
- #endregion
+ #endregion
#endregion
diff --git a/bsmd.database/DBManagerAsync.cs b/bsmd.database/DBManagerAsync.cs
new file mode 100644
index 00000000..304e85bf
--- /dev/null
+++ b/bsmd.database/DBManagerAsync.cs
@@ -0,0 +1,134 @@
+// Copyright (c) 2020-present schick Informatik
+// Description: The new and mighty DB manager that uses async methods and
+// connection pooling.. will try it out in Maersk/PO numbers and expand over the whole
+// app later
+
+using System;
+using System.Collections.Generic;
+using System.Data.SqlClient;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+using log4net;
+
+namespace bsmd.database
+{
+ public static class DBManagerAsync
+ {
+ #region Fields
+
+ private static ILog _log = LogManager.GetLogger(typeof(DBManagerAsync));
+ private static readonly SemaphoreSlim _asyncSemaphore = new SemaphoreSlim(1);
+
+ #endregion
+
+ #region Properties
+
+ public static string ConnectionString { get; set; }
+
+ #endregion
+
+ #region public methods
+
+
+
+ #endregion
+
+ #region async DB access methods
+
+
+
+ internal static async Task PerformCommandAsync(SqlCommand cmd)
+ {
+ SqlDataReader reader = null;
+
+ // await _asyncSemaphore.WaitAsync();
+ try
+ {
+ using (SqlConnection connection = new SqlConnection(ConnectionString))
+ {
+ await connection.OpenAsync();
+ reader = await cmd.ExecuteReaderAsync();
+ }
+ }
+ catch (SqlException ex)
+ {
+ Trace.WriteLine("SQL Exception:" + ex.Message);
+ _log.Error("Error performing command", ex);
+ _log.DebugFormat("Query: {0}", cmd.CommandText);
+ _log.Debug("Parameters:");
+ for (int i = 0; i < cmd.Parameters.Count; i++)
+ {
+ _log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
+ }
+ }
+ finally
+ {
+ // _asyncSemaphore.Release();
+ }
+
+ return reader;
+ }
+
+ internal static async Task PerformNonQuery(SqlCommand cmd)
+ {
+ int result = -1;
+ // await _asyncSemaphore.WaitAsync();
+ try
+ {
+ using (SqlConnection connection = new SqlConnection(ConnectionString))
+ {
+ await connection.OpenAsync();
+ result = await cmd.ExecuteNonQueryAsync();
+ }
+ }
+ catch (SqlException ex)
+ {
+ Trace.WriteLine("SQL Exception:" + ex.Message);
+ _log.Error("Error performing command", ex);
+ _log.DebugFormat("Query: {0}", cmd.CommandText);
+ _log.Debug("Parameters:");
+ for (int i = 0; i < cmd.Parameters.Count; i++)
+ {
+ _log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
+ }
+ }
+
+ return result;
+ }
+
+ internal static async Task PerformReadIntQuery(SqlCommand cmd)
+ {
+ int? result = null;
+
+ try
+ {
+ using (SqlConnection connection = new SqlConnection(ConnectionString))
+ {
+ object r = await cmd.ExecuteScalarAsync();
+ if (r == null) { result = null; }
+ else if (r == DBNull.Value) { result = null; }
+ else { result = (int)r; }
+ }
+ }
+ catch (SqlException ex)
+ {
+ _log.Error("Error performing command", ex);
+ _log.DebugFormat("Query: {0}", cmd.CommandText);
+ _log.Debug("Parameters:");
+ for (int i = 0; i < cmd.Parameters.Count; i++)
+ {
+ _log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
+ }
+ }
+
+ return result;
+ }
+
+ #endregion
+
+ }
+}
diff --git a/bsmd.database/DatabaseEntity.cs b/bsmd.database/DatabaseEntity.cs
index 738df298..749ca348 100644
--- a/bsmd.database/DatabaseEntity.cs
+++ b/bsmd.database/DatabaseEntity.cs
@@ -30,7 +30,7 @@ namespace bsmd.database
[DataContract]
public abstract class DatabaseEntity : IDatabaseEntity, IMessageParagraph, IEquatable, ICloneable
{
- protected Guid? id;
+ protected Guid? id;
protected string tablename;
private Guid instance_id = Guid.NewGuid(); // Comparison id in case entity has not been saved
private static readonly ILog _log = LogManager.GetLogger(typeof(DatabaseEntity));
@@ -124,7 +124,7 @@ namespace bsmd.database
public abstract void PrepareSave(IDbCommand cmd);
- public virtual void PrepareDelete(IDbCommand cmd)
+ public virtual void PrepareDelete(IDbCommand cmd)
{
SqlCommand scmd = cmd as SqlCommand;
scmd.CommandText = string.Format("DELETE FROM {0} WHERE Id = @ID", Tablename);
diff --git a/bsmd.database/Extensions.cs b/bsmd.database/Extensions.cs
index 29b03dbb..bcfd3866 100644
--- a/bsmd.database/Extensions.cs
+++ b/bsmd.database/Extensions.cs
@@ -117,11 +117,21 @@ namespace bsmd.database
_log.WarnFormat("{0} cannot be parsed as datetime", text);
return null;
}
- }
+ }
public static bool IsTimeEmpty(this DateTime datetime)
{
- return ((datetime.Hour == 0) && (datetime.Minute == 0) && (datetime.Second == 0));
+ return (datetime.Hour == 0) && (datetime.Minute == 0) && (datetime.Second == 0);
+ }
+
+ ///
+ /// Returns true if the date is between now and numDays in the future (or past, if numDays is negative)
+ ///
+ public static bool IsNextXDays(this DateTime datetime, int numDays)
+ {
+ double diff = (datetime - DateTime.Now).TotalDays;
+ if (numDays >= 0) return diff < numDays && diff > 0;
+ else return diff < numDays && diff < 0;
}
public static double? TryParseDouble(string text)
diff --git a/bsmd.database/MaerskData.cs b/bsmd.database/MaerskData.cs
new file mode 100644
index 00000000..433a0ad1
--- /dev/null
+++ b/bsmd.database/MaerskData.cs
@@ -0,0 +1,198 @@
+// Copyright (c) 2020-present schick Informatik
+// Description:
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlClient;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace bsmd.database
+{
+
+ ///
+ /// Extra balcony: Data stored in Maersk Excel sheets must be stored to be exported
+ /// at a later date. In order to do that (and to be a little more flexible in the future)
+ /// we use a generic storage class called "XtraData" that hopefully might be useful in another
+ /// future scenario as well
+ ///
+ public class MaerskData : DatabaseEntity
+ {
+
+ #region Construction
+ public MaerskData()
+ {
+ this.tablename = "[dbo].[MaerskData]";
+ }
+
+ #endregion
+
+ #region Properties
+
+ ///
+ /// reference id as set in the database
+ ///
+ public Guid MessageCoreId { get; set; }
+
+ ///
+ /// Core instance reference once matched / set
+ ///
+ public MessageCore Core { get; set; }
+
+ public bool HasNoIdea => ColM.IsNullOrEmpty();
+
+ public bool IsNextThreeDays => ETA.HasValue && ETA.Value.IsNextXDays(3);
+
+ public DateTime? ETA { get; set; }
+
+ public string ColA { get; set; }
+
+ public string ColB { get; set; }
+ ///
+ /// Shipping area?
+ ///
+ public string ColC { get; set; }
+
+ public string ColD { get; set; }
+ ///
+ /// Vessel name
+ ///
+ public string ColE { get; set; }
+ ///
+ /// IMO
+ ///
+ public string ColF { get; set; }
+ ///
+ /// Voyage-No incoming
+ ///
+ public string ColG { get; set; }
+ ///
+ /// Voyage-No outgoing
+ ///
+ public string ColH { get; set; }
+ ///
+ /// Terminal
+ ///
+ public string ColI { get; set; }
+ ///
+ /// Operator
+ ///
+ public string ColJ { get; set; }
+ ///
+ /// ETA
+ ///
+ public string ColK { get; set; }
+ ///
+ /// ETD
+ ///
+ public string ColL { get; set; }
+ ///
+ /// Visit-Id
+ ///
+ public string ColM { get; set; }
+
+ public string Remark { get; set; }
+
+ #endregion
+
+ #region abstract DatabaseEntity method implementation
+
+ public override List LoadList(IDataReader reader)
+ {
+ List result = new List();
+ if (reader != null)
+ {
+ while (reader.Read())
+ {
+ MaerskData md = new MaerskData();
+
+ md.id = reader.GetGuid(0);
+ if (!reader.IsDBNull(1)) md.MessageCoreId = reader.GetGuid(1);
+ if (!reader.IsDBNull(2)) md.ColA = reader.GetString(2);
+ if (!reader.IsDBNull(3)) md.ColB = reader.GetString(3);
+ if (!reader.IsDBNull(4)) md.ColC = reader.GetString(4);
+ if (!reader.IsDBNull(5)) md.ColD = reader.GetString(5);
+ if (!reader.IsDBNull(6)) md.ColE = reader.GetString(6);
+ if (!reader.IsDBNull(7)) md.ColF = reader.GetString(7);
+ if (!reader.IsDBNull(8)) md.ColG = reader.GetString(8);
+ if (!reader.IsDBNull(9)) md.ColH = reader.GetString(9);
+ if (!reader.IsDBNull(10)) md.ColI = reader.GetString(10);
+ if (!reader.IsDBNull(11)) md.ColJ = reader.GetString(11);
+ if (!reader.IsDBNull(12)) md.ColK = reader.GetString(12);
+ if (!reader.IsDBNull(13)) md.ColL = reader.GetString(13);
+ if (!reader.IsDBNull(14)) md.ColM = reader.GetString(14);
+ if (!reader.IsDBNull(15)) md.Remark = reader.GetString(15);
+
+ // try parsing the column to datetime
+ if (DateTime.TryParse(md.ColK, out DateTime eta))
+ ETA = eta;
+
+ result.Add(md);
+ }
+ reader.Close();
+ }
+ return result;
+ }
+
+ public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
+ {
+ string query = string.Format("SELECT Id, ReferenceId, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, Field10, Field11, Field12 , Field13, Field14 FROM {0} ", this.Tablename);
+
+ switch (filter)
+ {
+ case Message.LoadFilter.BY_ID:
+ query += " WHERE Id = @ID";
+ ((SqlCommand)cmd).Parameters.AddWithValue("@ID", criteria[0]);
+ break;
+ case Message.LoadFilter.BY_CORE:
+ query += " WHERE ReferenceId = @ID";
+ ((SqlCommand)cmd).Parameters.AddWithValue("@ID", criteria[0]);
+ break;
+ default:
+ break;
+ }
+
+ cmd.CommandText = query;
+ }
+
+ public override void PrepareSave(IDbCommand cmd)
+ {
+ SqlCommand scmd = cmd as SqlCommand;
+
+ scmd.Parameters.AddWithNullableValue("@REF", this.MessageCoreId);
+ scmd.Parameters.AddWithNullableValue("@COLA", this.ColA);
+ scmd.Parameters.AddWithNullableValue("@COLB", this.ColB);
+ scmd.Parameters.AddWithNullableValue("@COLC", this.ColC);
+ scmd.Parameters.AddWithNullableValue("@COLD", this.ColD);
+ scmd.Parameters.AddWithNullableValue("@COLE", this.ColE);
+ scmd.Parameters.AddWithNullableValue("@COLF", this.ColF);
+ scmd.Parameters.AddWithNullableValue("@COLG", this.ColG);
+ scmd.Parameters.AddWithNullableValue("@COLH", this.ColH);
+ scmd.Parameters.AddWithNullableValue("@COLI", this.ColI);
+ scmd.Parameters.AddWithNullableValue("@COLJ", this.ColJ);
+ scmd.Parameters.AddWithNullableValue("@COLK", this.ColK);
+ scmd.Parameters.AddWithNullableValue("@COLL", this.ColL);
+ scmd.Parameters.AddWithNullableValue("@COLM", this.ColM);
+ scmd.Parameters.AddWithNullableValue("@REMARK", this.Remark);
+
+ if (this.IsNew)
+ {
+ this.CreateId();
+ scmd.Parameters.AddWithValue("@ID", this.Id);
+ scmd.CommandText = string.Format("INSERT INTO {0} (Id, ReferenceId, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, Field10, Field11, Field12, Field13, Field14) " +
+ "VALUES (@ID, @REF, @COLA, @COLB, @COLC, @COLD, @COLE, @COLF, @COLG, @COLH, @COLI, @COLJ, @COLK, @COLL, @COLM, @REMARK)", this.Tablename);
+ }
+ else
+ {
+ scmd.Parameters.AddWithValue("@ID", this.Id);
+ scmd.CommandText = string.Format("UPDATE {0} SET Field1 = @COLA, Field2 = @COLB, Field3 = @COLC, Field4 = @COLD, Field5 = @COLE, Field6 = @COLF, @Field7 = @COLG, @Field8 = @COLH, " +
+ "Field9 = @COLI, Field10 = @COLJ, Field11 = @COLK, Field12 = @COLL, Field13 = @COLM, Field14 = @Remark WHERE Id = @ID", this.Tablename);
+ }
+ }
+
+ #endregion
+
+ }
+}
diff --git a/bsmd.database/MessageCore.cs b/bsmd.database/MessageCore.cs
index 191ec9d0..7601f683 100644
--- a/bsmd.database/MessageCore.cs
+++ b/bsmd.database/MessageCore.cs
@@ -621,8 +621,8 @@ namespace bsmd.database
case SearchFilterType.FILTER_ETA:
uint? from = null, to = null;
string[] elems = searchDict[key].Split(':');
- if (!elems[0].IsNullOrEmpty()) from = UInt32.Parse(elems[0]);
- if (!elems[1].IsNullOrEmpty()) to = UInt32.Parse(elems[1]);
+ if (!elems[0].IsNullOrEmpty()) from = uint.Parse(elems[0]);
+ if (!elems[1].IsNullOrEmpty()) to = uint.Parse(elems[1]);
// SQL Logik für die Zeitfilterung: Wenn es bereits eine Tabelle NOA_NOD mit einem Eintrag für ETAToPortOfCall / ETAToKielCanal gibt
// soll dieser Wert als Vergleich herangezogen werden, sonst ETA / ETAKielCanal aus MessageCore
@@ -697,16 +697,14 @@ namespace bsmd.database
case SearchFilterType.FILTER_FLAG_EQ:
{
sb.Append(" MessageCore.Flags = @FLAG ");
- int flag = 0;
- int.TryParse(searchDict[key], out flag);
+ int.TryParse(searchDict[key], out int flag);
((SqlCommand)cmd).Parameters.AddWithValue("@FLAG", flag);
break;
}
case SearchFilterType.FILTER_FLAG_NEQ:
{
- sb.Append(" MessageCore.Flags <> @FLAG ");
- int flag = 0;
- int.TryParse(searchDict[key], out flag);
+ sb.Append(" MessageCore.Flags <> @FLAG ");
+ int.TryParse(searchDict[key], out int flag);
((SqlCommand)cmd).Parameters.AddWithValue("@FLAG", flag);
break;
}
diff --git a/bsmd.database/bsmd.database.csproj b/bsmd.database/bsmd.database.csproj
index 96bd3403..2c2d57c7 100644
--- a/bsmd.database/bsmd.database.csproj
+++ b/bsmd.database/bsmd.database.csproj
@@ -111,6 +111,7 @@
+
@@ -126,6 +127,7 @@
+