From 45b3069ce7e4167ac6e466d0841509ade13b6e43 Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Tue, 27 Aug 2024 19:49:17 +0100 Subject: [PATCH] Saxonite 1.2.11.14 --- .../Base/Bus/SacsHierarchyItem.cs | 5 + SacsStandardBase/Base/Bus/SacsItemMgr.cs | 18 ++++ SacsStandardBase/Base/Dbas/DbQuery.cs | 98 +++++++++++-------- SacsStandardBase/Base/Dbas/ISacsDatabase.cs | 1 + SacsStandardBase/SacsStandardBase.csproj | 4 +- .../Dbas/Base/DatabaseDefinitionGenerator.cs | 12 ++- SacsStandardDbas/Dbas/Data/DbDataItem.cs | 9 +- .../Dbas/Data/SacsDatabaseOdbc.cs | 10 +- SacsStandardProc/SacsStandardProc.csproj | 4 +- 9 files changed, 109 insertions(+), 52 deletions(-) diff --git a/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs b/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs index c2727b1..84509c1 100644 --- a/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs +++ b/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs @@ -505,6 +505,11 @@ namespace Sarand.Net.Standard.Base.Bus public DbQuery.Paging ResultsPaging { get; } = new DbQuery.Paging(); /// Sort columns. public List SortColumns { get; } = new List(); + /// + /// Flag to return data in random order. + /// - NB Depends on implementation for each manager and item. + /// + public bool RandomOrder { get; set; } = false; } //------------------------------------------------------------------- diff --git a/SacsStandardBase/Base/Bus/SacsItemMgr.cs b/SacsStandardBase/Base/Bus/SacsItemMgr.cs index a1988e1..6d6f417 100644 --- a/SacsStandardBase/Base/Bus/SacsItemMgr.cs +++ b/SacsStandardBase/Base/Bus/SacsItemMgr.cs @@ -1,5 +1,9 @@ using System; +using System.Collections.Generic; +using System.Linq; +using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; namespace Sarand.Net.Standard.Base.Bus @@ -57,6 +61,20 @@ namespace Sarand.Net.Standard.Base.Bus return true; } + //------------------------------------------------------------------- + // S o r t C o l u m n s + //------------------------------------------------------------------- + protected void AddRandomSortColumn (SacsHierarchyItem.Params prm, HashSet sortColumns) + { + if (!prm.RandomOrder) return; + if (sortColumns.Any()) + { + SaLogger.Warn($"{SysUtil.Fn} RandomOrder requested with other sort columns specified. [{prm.GetType().Name}]"); + return; + } + sortColumns.Add(DbQuery.GetRandomOrderSortColumn()); + } + //------------------------------------------------------------------- } //======================================================================= diff --git a/SacsStandardBase/Base/Dbas/DbQuery.cs b/SacsStandardBase/Base/Dbas/DbQuery.cs index 3ffeb90..34e9f87 100644 --- a/SacsStandardBase/Base/Dbas/DbQuery.cs +++ b/SacsStandardBase/Base/Dbas/DbQuery.cs @@ -49,7 +49,7 @@ namespace Sarand.Net.Standard.Base.Dbas // methods that depend on the value (especially static ones). public class DbGlobalDbms { - private DbGlobalDbms () { } + private DbGlobalDbms() { } private static DbmsType dbms = DbmsType.General; public static DbmsType Type { @@ -66,7 +66,7 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // Construction. - public DbQueryJoin (DbJoinType type = DbJoinType.Inner) + public DbQueryJoin(DbJoinType type = DbJoinType.Inner) { this.Type = type; } @@ -80,7 +80,7 @@ namespace Sarand.Net.Standard.Base.Dbas public List SubJoins { get; } = new List(); //------------------------------------------------------------------- - public static String GetJoinType (DbJoinType type) + public static String GetJoinType(DbJoinType type) { switch (type) { @@ -94,7 +94,7 @@ namespace Sarand.Net.Standard.Base.Dbas } //------------------------------------------------------------------- - public String BuildJoin (String enclosedJoin) + public String BuildJoin(String enclosedJoin) { //--------------------------------------------------------------- // Select syntax. @@ -129,7 +129,7 @@ namespace Sarand.Net.Standard.Base.Dbas // Sage doesn't use 'AS' to alias tables. String tableAliasOperator = (DbGlobalDbms.Type == DbmsType.Sage ? " " : " AS "); String joinType = GetJoinType(Type); - String joinTable = Table.Concat (tableAliasOperator, false); + String joinTable = Table.Concat(tableAliasOperator, false); String subJoinData = String.Empty; foreach (var subJoin in SubJoins) { @@ -184,7 +184,7 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // Debugging. - public void Dump () + public void Dump() { SaLogger.Debug($"{SysUtil.Fn}"); SaLogger.Debug("\tType = " + GetJoinType(Type)); @@ -204,7 +204,7 @@ namespace Sarand.Net.Standard.Base.Dbas { //------------------------------------------------------------------- // List extensions. - public static String BuildJoins (this List joins, String primaryTable) + public static String BuildJoins(this List joins, String primaryTable) { String joinData = primaryTable; if (joins.Count > 0) @@ -265,6 +265,11 @@ namespace Sarand.Net.Standard.Base.Dbas public uint PageNo { get; set; } = 0; public ushort PageLength { get; set; } = 0; public virtual bool Paged { get { return PageNo > 0 && PageLength > 0; } } + public void Set(uint pageNo, ushort pageLength) + { + this.PageNo = pageNo; + this.PageLength = pageLength; + } } //------------------------------------------------------------------- @@ -272,7 +277,7 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // Construction. - public DbQuery (DbmsType dbms) + public DbQuery(DbmsType dbms) { DbGlobalDbms.Type = dbms; } @@ -297,7 +302,7 @@ namespace Sarand.Net.Standard.Base.Dbas /// Format the value so that it can be used in a conditional clause. /// - single quotes are duplicated. /// - public static String FormatForCondition (String value) + public static String FormatForCondition(String value) { return StringUtil.EmptyOnNull(value).Replace("'", "''"); } @@ -308,7 +313,7 @@ namespace Sarand.Net.Standard.Base.Dbas /// - percent ('%') is enclosed in square brackets ('[%]') unless wildcards allowed. /// - asterisk ('*') converted to percent ('%') if wildcards allowed. /// - public static String FormatForLike (String value, bool allowWildcards = false) + public static String FormatForLike(String value, bool allowWildcards = false) { value = StringUtil.EmptyOnNull(value).Replace("'", "''").Replace("[", "[[]"); if (allowWildcards) @@ -327,7 +332,7 @@ namespace Sarand.Net.Standard.Base.Dbas /// - Format as: ('Value1','Value2','Value3') if string data, else (Value1,Value2,Value3) etc. /// - Returns empty string if list is empty. /// - public static String FormatForIn (List rawValues, bool stringData = true, bool ignoreBlanks = true) + public static String FormatForIn(List rawValues, bool stringData = true, bool ignoreBlanks = true) { String result = String.Empty; List values = new List(); @@ -351,14 +356,14 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // D a t e V a l u e F o r m a t t i n g //------------------------------------------------------------------- - public static String GetDateDelim () + public static String GetDateDelim() { String delim = "#"; // MS Access only? if (DbGlobalDbms.Type == DbmsType.MsSql) delim = "'"; // MS SQL Server. return delim; } - public static String FormatDateForCondition (DateTime date, bool delimit = true, bool includeMidnight = false) + public static String FormatDateForCondition(DateTime date, bool delimit = true, bool includeMidnight = false) { String value = DateUtil.Format(date, "dd-MMM-yyyy"); if (includeMidnight) @@ -370,9 +375,9 @@ namespace Sarand.Net.Standard.Base.Dbas } return value; } - public static String FormatDateTimeForCondition (DateTime dateTime, bool delimit = true, bool precise = false) + public static String FormatDateTimeForCondition(DateTime dateTime, bool delimit = true, bool precise = false) { - String value = DateUtil.Format(dateTime, "yyyy-MM-dd HH:mm:ss"+(precise?".fff":"")); + String value = DateUtil.Format(dateTime, "yyyy-MM-dd HH:mm:ss" + (precise ? ".fff" : "")); if (delimit) { String delim = GetDateDelim(); @@ -381,7 +386,7 @@ namespace Sarand.Net.Standard.Base.Dbas return value; } - public static String FormatTimeForCondition (DateTime time, bool delimit = true, bool zeroSeconds = false) + public static String FormatTimeForCondition(DateTime time, bool delimit = true, bool zeroSeconds = false) { String value = String.Empty; if (zeroSeconds) @@ -399,7 +404,7 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // F o r m a t F o r F i l t e r //------------------------------------------------------------------- - public static String FormatNullValueFilter (String expression, bool excludeNulls) + public static String FormatNullValueFilter(String expression, bool excludeNulls) { String clause = String.Empty; expression = StringUtil.EmptyOnNull(expression).Trim(); @@ -430,7 +435,7 @@ namespace Sarand.Net.Standard.Base.Dbas } // Construct 'Order By' clauses, allowing direction (ASC/DESC) and whether // to demote NULL values (push to end of sequence) into account. - public static List FormatForOrderBy (String expression, bool ascending, DbOrderByNullMode nullMode = DbOrderByNullMode.Default, bool treatZeroAsNull = false) + public static List FormatForOrderBy(String expression, bool ascending, DbOrderByNullMode nullMode = DbOrderByNullMode.Default, bool treatZeroAsNull = false) { List orderBy = new List(); expression = StringUtil.EmptyOnNull(expression).Trim(); @@ -485,25 +490,25 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // NB Many functions depend on the DBMS in use. // Default versions are for Access/SQL. - public static String FormatFn_Len (String column) + public static String FormatFn_Len(String column) { if (String.IsNullOrEmpty(column)) return "''"; // MS Access. return "Len(" + column + ")"; } - public static String FormatFn_Left (String column, int length) + public static String FormatFn_Left(String column, int length) { if (String.IsNullOrEmpty(column) || length < 1) return "''"; // MS Access. return "Left(" + column + "," + length.ToString() + ")"; } - public static String FormatFn_Right (String column, int length) + public static String FormatFn_Right(String column, int length) { if (String.IsNullOrEmpty(column) || length < 1) return "''"; // MS Access. return "Right(" + column + "," + length.ToString() + ")"; } - public static String FormatFn_TimeValue (String expression) + public static String FormatFn_TimeValue(String expression) { if (DbGlobalDbms.Type == DbmsType.MsSql) { @@ -526,13 +531,13 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // N u m e r i c F u n c t i o n s //------------------------------------------------------------------- - public static String FormatFn_Abs (String sExpr) + public static String FormatFn_Abs(String sExpr) { if (sExpr.IsEmpty()) return "''"; return "Abs(" + sExpr + ")"; } - public static String FormatFn_Round (String expression, int decimals = 0) + public static String FormatFn_Round(String expression, int decimals = 0) { if (String.IsNullOrEmpty(expression) || decimals < 0) return "''"; if (DbGlobalDbms.Type == DbmsType.Access) @@ -545,7 +550,7 @@ namespace Sarand.Net.Standard.Base.Dbas return "Round(" + expression + "," + decimals.ToString() + ")"; } - public static String FormatFn_Truncate (String expression, int decimals = 0) + public static String FormatFn_Truncate(String expression, int decimals = 0) { if (String.IsNullOrEmpty(expression) || decimals < 0) return "''"; if (DbGlobalDbms.Type == DbmsType.MsSql) @@ -554,13 +559,13 @@ namespace Sarand.Net.Standard.Base.Dbas // MS Access. if (decimals > 0) { - String factor = ((long)(10^decimals)).ToString(); + String factor = ((long)(10 ^ decimals)).ToString(); return "Int(" + expression + "*" + factor + "," + decimals.ToString() + ")/" + factor; } return "Int(" + expression + "," + decimals.ToString() + ")"; } - public static String FormatFn_FormatNumber (String expression, int decimals) + public static String FormatFn_FormatNumber(String expression, int decimals) { if (String.IsNullOrEmpty(expression) || decimals < 0) return "''"; // MS Access. @@ -571,7 +576,7 @@ namespace Sarand.Net.Standard.Base.Dbas // D a t e D i f f e r e n c e //------------------------------------------------------------------- // Date difference: eg. DateDiff('n',Col1,Col2). - public static String FormatFn_DateDiff (DbDateDiffInterval dateInterval, String column1, String column2) + public static String FormatFn_DateDiff(DbDateDiffInterval dateInterval, String column1, String column2) { if (column1.IsEmpty() || column2.IsEmpty()) return "''"; String interval = String.Empty; @@ -618,7 +623,7 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // B i t M a p p e d V a l u e s //------------------------------------------------------------------- - public static String BuildBitMappedValue (String column, ushort bit, bool match) + public static String BuildBitMappedValue(String column, ushort bit, bool match) { // Filter clause to test for specific bit set in field. String clause = String.Empty; @@ -627,7 +632,7 @@ namespace Sarand.Net.Standard.Base.Dbas if (bit > 0 && bit <= 32) { // The operation depends on whether the value should be matched or not. - String condition = (match? "<>" : "="); + String condition = (match ? "<>" : "="); // Test is achieved by shifting the value so as to drop the target bit, shift back one bit // and identify those value that then do not match the original value shifted by one place less. // Example match: abcdefgh, Test bit 3: abcde0 <> abcdef @@ -651,7 +656,7 @@ namespace Sarand.Net.Standard.Base.Dbas return clause; } - public static String BuildBitMappedFilter (String column, ushort bit, bool match) + public static String BuildBitMappedFilter(String column, ushort bit, bool match) { String clause = BuildBitMappedValue(column, bit, match); if (!clause.IsEmpty()) @@ -662,10 +667,25 @@ namespace Sarand.Net.Standard.Base.Dbas return clause; } + //------------------------------------------------------------------- + // S o r t C o l u m n s + //------------------------------------------------------------------- + public static String GetRandomOrderSortColumn() + { + return GetRandomOrderSortColumn(DbGlobalDbms.Type); + } + public static String GetRandomOrderSortColumn(DbmsType dbms) + { + if (dbms == DbmsType.MsSql) + return "NewId()"; + // ToDo: Random sort order by DBMS. + return "Random()"; + } + //------------------------------------------------------------------- // A t t r i b u t e s //------------------------------------------------------------------- - public void Clear () + public void Clear() { Tables.Clear(); Columns.Clear(); @@ -674,7 +694,7 @@ namespace Sarand.Net.Standard.Base.Dbas OrderBy.Clear(); Joins.Clear(); } - public bool IsValid () + public bool IsValid() { return (Tables.Count > 0); } @@ -682,7 +702,7 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // B u i l d Q u e r y //------------------------------------------------------------------- - public String BuildQuery (Paging paging = null) + public String BuildQuery(Paging paging = null) { if (Tables.Count < 1) return ""; @@ -696,7 +716,7 @@ namespace Sarand.Net.Standard.Base.Dbas //--------------------------------------------------------------------- // Add the tables and joins. - String tableAliasOperator = DbGlobalDbms.Type == DbmsType.Sage? " " : " AS "; + String tableAliasOperator = DbGlobalDbms.Type == DbmsType.Sage ? " " : " AS "; if (Tables.Count > 1 || Joins.Count < 1) { query += " FROM " + Tables.Concat(tableAliasOperator, false).Concat(",") + " " + Joins.BuildJoins(""); @@ -710,7 +730,7 @@ namespace Sarand.Net.Standard.Base.Dbas //--------------------------------------------------------------------- // Filters. - String filter = Filters.Concat (" AND ", "(", ")", true, true); + String filter = Filters.Concat(" AND ", "(", ")", true, true); // Jan2019 Not required: if (Filters.Count > 1) filter = "(" + filter + ")"; if (!filter.IsEmpty()) query += " WHERE " + filter; @@ -728,9 +748,9 @@ namespace Sarand.Net.Standard.Base.Dbas // Must have an 'Order By' clause to use 'Offset ... Fetch Next ...' if (orderByData.IsEmpty()) throw new NotSupportedException("Query paging requires sort order to be specified"); - if (DbGlobalDbms.Type != DbmsType.MsSql) - throw new NotSupportedException("Query paging only supported for MS SQL"); - query += " OFFSET " + ((paging.PageNo - 1) * paging.PageLength) + " ROWS FETCH NEXT " + paging.PageLength + " ROWS ONLY"; + if (DbGlobalDbms.Type == DbmsType.MsSql) + query += " OFFSET " + ((paging.PageNo - 1) * paging.PageLength) + " ROWS FETCH NEXT " + paging.PageLength + " ROWS ONLY"; + else throw new NotSupportedException($"Query paging not supported for {DbGlobalDbms.Type}"); } //--------------------------------------------------------------------- diff --git a/SacsStandardBase/Base/Dbas/ISacsDatabase.cs b/SacsStandardBase/Base/Dbas/ISacsDatabase.cs index af2faf5..45a99e0 100644 --- a/SacsStandardBase/Base/Dbas/ISacsDatabase.cs +++ b/SacsStandardBase/Base/Dbas/ISacsDatabase.cs @@ -20,6 +20,7 @@ namespace Sarand.Net.Standard.Base.Dbas FoxPro, Paradox, Interbase, + Postgres, /// Sage db - No 'AS' in table alias, no 'OUTER' in join type. Sage, QBooks, diff --git a/SacsStandardBase/SacsStandardBase.csproj b/SacsStandardBase/SacsStandardBase.csproj index 8eed933..9ceea93 100644 --- a/SacsStandardBase/SacsStandardBase.csproj +++ b/SacsStandardBase/SacsStandardBase.csproj @@ -7,11 +7,11 @@ - + - + diff --git a/SacsStandardDbas/Dbas/Base/DatabaseDefinitionGenerator.cs b/SacsStandardDbas/Dbas/Base/DatabaseDefinitionGenerator.cs index 42da43a..a0a74a9 100644 --- a/SacsStandardDbas/Dbas/Base/DatabaseDefinitionGenerator.cs +++ b/SacsStandardDbas/Dbas/Base/DatabaseDefinitionGenerator.cs @@ -77,7 +77,7 @@ namespace Sarand.Net.Standard.Dbas.Base public class TableClassConfig { /// Using namespaces for table classes. - public HashSet Usings { get; } = new HashSet() { "Sarand.Net.Standard.Base.Core", "Sarand.Net.Standard.Base.Dbas" }; + public HashSet Usings { get; } = new HashSet() { "Sarand.Net.Standard.Base.App", "Sarand.Net.Standard.Base.Core", "Sarand.Net.Standard.Base.Dbas" }; public String Namespace_BaseClass { get; set; } = "Sarand.Net.Standard.Dbas.Data"; public String Namespace { get; set; } = "Sarand.Application.Dbas"; public String BaseClass { get; set; } = "DbDataItem"; @@ -672,6 +672,7 @@ namespace Sarand.Net.Standard.Dbas.Base file.WriteLine(tab2 + "// Existing columns - confirmed on database if table exists."); file.WriteLine(tab2 + "public List ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }"); file.WriteLine(tab2 + "public List ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }"); + file.WriteLine(tab2 + "public List UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }"); //----------------------------------------------------------- // Population. @@ -787,7 +788,7 @@ namespace Sarand.Net.Standard.Dbas.Base // Construct update command. file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------"); file.WriteLine(tab2 + "// Update command."); - file.WriteLine(tab2 + "public override bool ExecuteUpdateCommand (DbCommand dbCommand)"); + file.WriteLine(tab2 + "public override bool ExecuteUpdateCommand (DbCommand dbCommand, List columnsToUpdate = null)"); file.WriteLine(tab2 + "{"); if (!String.IsNullOrEmpty(identityColumnName)) { @@ -795,7 +796,12 @@ namespace Sarand.Net.Standard.Dbas.Base file.WriteLine(tab3 + "if (_" + identityColumnName + " == 0) throw new Exception(\"Invalid for Update - item has an invalid Id\"); "); } file.WriteLine(tab3 + "// Columns to update."); - file.WriteLine(tab3 + "List columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();"); + file.WriteLine(tab3 + "List columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();"); + file.WriteLine(tab3 + "if (!columnNames.Any())"); + file.WriteLine(tab3 + "{"); + file.WriteLine(tab4 + "SaLogger.Warn($\"{SysUtil.Fn} No columns to update. [{GetType().Name}]\");"); + file.WriteLine(tab4 + "return false;"); + file.WriteLine(tab3 + "}"); file.WriteLine(tab3 + "// Construct query."); file.WriteLine(tab3 + "String query = \"UPDATE \" + TableNameFmt + \" SET \";"); List columnsValuesToUpdate = new List(); diff --git a/SacsStandardDbas/Dbas/Data/DbDataItem.cs b/SacsStandardDbas/Dbas/Data/DbDataItem.cs index 6b1c730..49b201f 100644 --- a/SacsStandardDbas/Dbas/Data/DbDataItem.cs +++ b/SacsStandardDbas/Dbas/Data/DbDataItem.cs @@ -590,7 +590,14 @@ namespace Sarand.Net.Standard.Dbas.Data //------------------------------------------------------------------- // Database updates via ODBC Command. public abstract bool ExecuteInsertCommand(DbCommand dbCommand); - public abstract bool ExecuteUpdateCommand(DbCommand dbCommand); + public virtual bool ExecuteUpdateCommand(DbCommand dbCommand) + { + return ExecuteUpdateCommand(dbCommand, null); + } + public virtual bool ExecuteUpdateCommand(DbCommand dbCommand, List columns = null) + { + throw new NotImplementedException($"ExecuteUpdateCommand(dbCmd,cols) not overridden. [{GetType().Name}]"); + } //public abstract bool ExecuteDeleteCommand (DbCommand dbCommand); //------------------------------------------------------------------- diff --git a/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs b/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs index e972b3d..955fc2d 100644 --- a/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs +++ b/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs @@ -190,7 +190,7 @@ namespace Sarand.Net.Standard.Dbas.Data } catch (Exception exc) { - SaLogger.Error(SysUtil.Fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true); + SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc)}\nQuery:\n\t{String.Join("\n\t", query.ReplaceAll("\n\r", "\n").Split("\n"))}", true); SetErrorState(exc.Message); } return new DbDataTable(dataTable); @@ -213,7 +213,7 @@ namespace Sarand.Net.Standard.Dbas.Data } catch (Exception exc) { - SaLogger.Error(SysUtil.Fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true); + SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc)}\nQuery:\n\t{String.Join("\n\t", query.ReplaceAll("\n\r", "\n").Split("\n"))}", true); SetErrorState(exc.Message); } } @@ -241,7 +241,7 @@ namespace Sarand.Net.Standard.Dbas.Data } catch (Exception exc) { - SaLogger.Error(SysUtil.Fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true); + SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc)}\nQuery:\n\t{String.Join("\n\t", query.ReplaceAll("\n\r", "\n").Split("\n"))}", true); SetErrorState(exc.Message); } } @@ -270,7 +270,7 @@ namespace Sarand.Net.Standard.Dbas.Data } catch (Exception exc) { - SaLogger.Error(SysUtil.Fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true); + SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc)}\nQuery:\n\t{String.Join("\n\t", query.ReplaceAll("\n\r", "\n").Split("\n"))}", true); SetErrorState(exc.Message); } } @@ -297,7 +297,7 @@ namespace Sarand.Net.Standard.Dbas.Data } catch (Exception exc) { - SaLogger.Error(SysUtil.Fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true); + SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc)}\nQuery:\n\t{String.Join("\n\t", query.ReplaceAll("\n\r", "\n").Split("\n"))}", true); SetErrorState(exc.Message); } } diff --git a/SacsStandardProc/SacsStandardProc.csproj b/SacsStandardProc/SacsStandardProc.csproj index 0c39eae..b106356 100644 --- a/SacsStandardProc/SacsStandardProc.csproj +++ b/SacsStandardProc/SacsStandardProc.csproj @@ -10,8 +10,8 @@ - - + +