BusinessMgr 3.0.2.1

This commit is contained in:
Andy Howard
2025-11-29 17:03:24 +00:00
parent 796dd7cc2b
commit c01aa9441b
+56 -46
View File
@@ -1,18 +1,18 @@
using System;
using Microsoft.Data.SqlClient;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Base.Utils;
using System.Diagnostics;
using Sarand.Net.Standard.Base.Security;
using System.Linq;
namespace Sarand.Net.Standard.Dbas.Data
{
@@ -75,10 +75,10 @@ namespace Sarand.Net.Standard.Dbas.Data
PopulateNextIdTableDfn();
// Next Id database definitions.
String colObject = NextIdTable + "." + NextIdColumn_Object;
String colNextId = NextIdTable + "." + NextIdColumn_NextId;
String colObject = $"{NextIdTable}.{NextIdColumn_Object}";
String colNextId = $"{NextIdTable}.{NextIdColumn_NextId}";
String colAliasNextId = "NxtId";
String filter = "(" + colObject + ")='" + objectName + "'";
String filter = $"({colObject})='{objectName}'";
bool hasCreateCols = (nextIdTableDfn.HasColumnByName(DbCol_CreateOn) && nextIdTableDfn.HasColumnByName(DbCol_CreateBy));
bool hasUpdateCols = (nextIdTableDfn.HasColumnByName(DbCol_UpdateOn) && nextIdTableDfn.HasColumnByName(DbCol_UpdateBy));
@@ -102,7 +102,7 @@ namespace Sarand.Net.Standard.Dbas.Data
updateColumnValues.Add(DbCol_UpdateOn, DbQuery.FormatDateTimeForCondition(DateTime.Now));
updateColumnValues.Add(DbCol_UpdateBy, SysId.IsValid(dbUpdateInfo.UserId) ? SysId.ToString(dbUpdateInfo.UserId) : "0");
}
String updateQry = "Update " + NextIdTable + " Set " + updateColumnValues.Concat("=").Concat(", ") + " Where " + filter;
String updateQry = $"Update {NextIdTable} Set {updateColumnValues.Concat("=").Concat(", ")} Where {filter}";
//SaLogger.Debug($"{SysUtil.Fn} Update query: {updateQry}");
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
@@ -122,7 +122,7 @@ namespace Sarand.Net.Standard.Dbas.Data
// Construct query to store Next Id value.
List<StringPair> insertColumnValues = new List<StringPair>();
insertColumnValues.Add(NextIdColumn_Object, "'" + DbQuery.FormatForCondition(objectName) + "'");
insertColumnValues.Add(NextIdColumn_Object, $"'{DbQuery.FormatForCondition(objectName)}'");
insertColumnValues.Add(NextIdColumn_NextId, (nextIdValue + 1).ToString());
if (hasCreateCols)
{
@@ -134,7 +134,7 @@ namespace Sarand.Net.Standard.Dbas.Data
insertColumnValues.Add(DbCol_UpdateOn, DbQuery.FormatDateTimeForCondition(DateTime.Now));
insertColumnValues.Add(DbCol_UpdateBy, SysId.IsValid(dbUpdateInfo.UserId) ? SysId.ToString(dbUpdateInfo.UserId) : "0");
}
String insertQry = "Insert Into " + NextIdTable + " (" + insertColumnValues.GetValues(StringPair.Value.Value1).Concat(",") + ") Values (" + insertColumnValues.GetValues(StringPair.Value.Value2).Concat(",") + ")";
String insertQry = $"Insert Into {NextIdTable} ({insertColumnValues.GetValues(StringPair.Value.Value1).Concat(",")}) Values ({insertColumnValues.GetValues(StringPair.Value.Value2).Concat(",")})";
SaLogger.Debug($"{SysUtil.Fn} Insert query: {insertQry}");
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
@@ -150,7 +150,7 @@ namespace Sarand.Net.Standard.Dbas.Data
}
public override int GetNextIdFromTable(String objectName, String idColumn = "Id")
{
DataValue maxId = GetRowValue(SaSecurityDbDfn.DelimitReservedWord(objectName), "Max(" + idColumn + ")", "");
DataValue maxId = GetRowValue(SaSecurityDbDfn.DelimitReservedWord(objectName), $"Max({idColumn})", "");
if (maxId != null && maxId.GetDataType() != DataValue.DataType.Unknown)
return Math.Max(0, (int)maxId.AsLong()) + 1;
return 1;
@@ -176,7 +176,7 @@ namespace Sarand.Net.Standard.Dbas.Data
public override DbResultSet ExecuteQuery(String query)
{
ClearErrorState();
Log(SysUtil.Fn, "Query: " + query, SaMessageLevel.Debug);
Log(SysUtil.Fn, $"Query: {query}", SaMessageLevel.Debug);
try
{
return DbResultSet_DataReader.ExecuteQuery(this, query);
@@ -193,7 +193,7 @@ namespace Sarand.Net.Standard.Dbas.Data
public override int ExecuteNonQuery(string query)
{
ClearErrorState();
Log(SysUtil.Fn, "Query: " + query, SaMessageLevel.Debug);
Log(SysUtil.Fn, $"Query: {query}", SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
@@ -218,10 +218,8 @@ namespace Sarand.Net.Standard.Dbas.Data
{
ClearErrorState();
String query =
"INSERT INTO " + tableName + " " +
"(" + columnNameValues.GetValues(StringPair.Value.Value1).Concat(", ") + ") " +
"VALUES (" + columnNameValues.GetValues(StringPair.Value.Value2).Concat(", ") + ")";
Log(SysUtil.Fn, "Query: " + query, SaMessageLevel.Debug);
$"INSERT INTO {tableName} ({columnNameValues.GetValues(StringPair.Value.Value1).Concat(", ")}) VALUES ({columnNameValues.GetValues(StringPair.Value.Value2).Concat(", ")})";
Log(SysUtil.Fn, $"Query: {query}", SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
@@ -245,12 +243,10 @@ namespace Sarand.Net.Standard.Dbas.Data
public override int ExecuteUpdate(String tableName, List<StringPair> columnNameValues, String filter)
{
ClearErrorState();
String query =
"UPDATE " + tableName + " " +
"SET " + columnNameValues.Concat("=").Concat(", ");
if (!StringUtil.IsEmpty(filter))
query += (String)" WHERE " + filter;
Log(SysUtil.Fn, "Query: " + query, SaMessageLevel.Debug);
String query = $"UPDATE {tableName} SET {columnNameValues.Concat("=").Concat(", ")}";
if (!StringUtil.IsBlank(filter))
query += $" WHERE {filter}";
Log(SysUtil.Fn, $"Query: {query}", SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
@@ -274,10 +270,10 @@ namespace Sarand.Net.Standard.Dbas.Data
public override int ExecuteDelete(String tableName, String filter)
{
ClearErrorState();
String query = "DELETE FROM " + tableName;
if (!StringUtil.IsEmpty(filter))
query += " WHERE " + filter;
Log(SysUtil.Fn, "Query: " + query, SaMessageLevel.Debug);
String query = $"DELETE FROM {tableName}";
if (!StringUtil.IsBlank(filter))
query += $" WHERE {filter}";
Log(SysUtil.Fn, $"Query: {query}", SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
@@ -305,7 +301,7 @@ namespace Sarand.Net.Standard.Dbas.Data
try
{
String colAlias = "DataValue";
String query = "SELECT " + columnName + " '" + colAlias + "' FROM " + tableName + (!StringUtil.IsEmpty(filter) ? " WHERE " + filter : "");
String query = $"SELECT {columnName} '{colAlias}' FROM {tableName}{(!StringUtil.IsBlank(filter) ? $" WHERE {filter}" : "")}";
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(this, query))
{
if (dbResultSet.NextRecord())
@@ -316,7 +312,7 @@ namespace Sarand.Net.Standard.Dbas.Data
}
catch (Exception exc)
{
SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc)}\n\tTable: {tableName}. Column: {columnName}. Filter: " + (!StringUtil.IsEmpty(filter) ? filter : "<none>"), true);
SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc)}\n\tTable: {tableName}. Column: {columnName}. Filter: {(!StringUtil.IsBlank(filter) ? filter : "<none>")}", true);
SetErrorState(exc.Message);
}
return null;
@@ -344,7 +340,7 @@ namespace Sarand.Net.Standard.Dbas.Data
fn = "MIN";
else if (getValueType == DbGetValueType.eDbValueMax)
fn = "MAX";
return GetRowValue(tableName, fn + "(" + columnName + ")", filter);
return GetRowValue(tableName, $"{fn}({columnName})", filter);
}
//-------------------------------------------------------------------
@@ -352,8 +348,18 @@ namespace Sarand.Net.Standard.Dbas.Data
//-------------------------------------------------------------------
// NB Always use ODBC connection for querying schema.
// eg. SQL Connection GetSchema('Indices') doesn't return index columns.
public override HashSet<String> GetTableNames(bool refresh = false)
{
// Nov25 AH Was querying just table properties (not columns/indices) if definitions
// not previously fully populated (in GetTableDfns()) but this resulted in repeated
// querying of table properties, hence get full details immediately.
GetTableDfns();
lock (tableDfns)
{
return tableDfns.Values.GetNames().ToHashSet(StringComparer.InvariantCultureIgnoreCase);
}
/*
lock (tableDfns)
{
// Only populate table names if not previously done.
@@ -368,7 +374,9 @@ namespace Sarand.Net.Standard.Dbas.Data
}
return tableDfns.Values.GetNames().ToHashSet(StringComparer.InvariantCultureIgnoreCase);
}
*/
}
public override List<DbDfnTable> GetTableDfns(bool refresh = false)
{
lock (tableDfns)
@@ -401,6 +409,7 @@ namespace Sarand.Net.Standard.Dbas.Data
return new List<DbDfnTable>(tableDfns.Values);
}
}
public void ClearTableDfns()
{
lock (tableDfns)
@@ -409,6 +418,7 @@ namespace Sarand.Net.Standard.Dbas.Data
tableDfnsPopulated = false;
}
}
public override DbDfnTable GetTableDfn(String tableName, bool refresh = false)
{
lock (tableDfns)
@@ -418,7 +428,7 @@ namespace Sarand.Net.Standard.Dbas.Data
// Remove current table definition.
tableDfns.Remove(tableName);
}
// Only populate the specified table if required.
// Only populate the specified table.
DbDfnTable table = tableDfns.GetValueOrDefault(tableName);
if (table == null || !table.HasColumns())
{
@@ -443,7 +453,7 @@ namespace Sarand.Net.Standard.Dbas.Data
private static List<DbDfnTable> GetTableDefinitions(DbConnection dbConnection, String tableNameRestriction = null)
{
List<DbDfnTable> tables = new List<DbDfnTable>();
if (SacsSystem.DebugMode) SaLogger.Debug($"{SysUtil.Fn} Database: {dbConnection.Database}." + (!StringUtil.IsEmpty(tableNameRestriction) ? $" Table: {tableNameRestriction}." : ""));
if (SacsSystem.DebugMode) SaLogger.Debug($"{SysUtil.Fn} Database: {dbConnection.Database}.{(!StringUtil.IsEmpty(tableNameRestriction) ? $" Table: {tableNameRestriction}." : "")}");
String[] restrictions = new String[] { null, null, tableNameRestriction }; // database, owner, table name, type
using (DataTable tableSchema = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Tables, restrictions))
{
@@ -570,7 +580,7 @@ namespace Sarand.Net.Standard.Dbas.Data
{
String colName = column.ColumnName;
String value = row[colName].ToString();
//if (columnName.EqualsCI("CreateOn")) SaLogger.Debug(GetType().Name+".PopulateTableColumns Schema column name: " + colName + " [" + value + "]");
//if (columnName.EqualsCI("CreateOn")) SaLogger.Debug($"{GetType().Name}.PopulateTableColumns Schema column name: {colName} [{value}]");
if (colName.EqualsCI("TABLE_CAT") || colName.EqualsCI("TABLE_CATALOG") || colName.EqualsCI("TABLE_QUALIFIER") || colName.EqualsCI("QualifierName"))
database = value;
else if (colName.EqualsCI("TABLE_SCHEM") || colName.EqualsCI("TABLE_SCHEMA") || colName.EqualsCI("TABLE_OWNER") || colName.EqualsCI("OwnerName"))
@@ -654,7 +664,7 @@ namespace Sarand.Net.Standard.Dbas.Data
}
if (!StringUtil.IsEmpty(columnName))
{
//SaLogger.Debug(GetType().Name+".PopulateTableColumns Database=" + database + ", Schema=" + schema + ", Table=" + tableName + ", Column=" + columnName);
//SaLogger.Debug($"{GetType().Name}.PopulateTableColumns Database={database}, Schema={schema}, Table={tableName}, Column={columnName}");
DbDfnColumn column = new DbDfnColumn(schema, tableName, ++columnPos, columnName);
column.DataTypeNative = nativeDataType;
column.DataTypeNameNative = nativeDataTypeName;
@@ -678,7 +688,7 @@ namespace Sarand.Net.Standard.Dbas.Data
// Retrieve additional information via SqlDataReader.
using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
{
sqlCommand.CommandText = "Select Top 1 * From [" + table.Name + "]";
sqlCommand.CommandText = $"Select Top 1 * From [{table.Name}]";
using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(CommandBehavior.SchemaOnly))
using (DataTable dataTable = sqlDataReader.GetSchemaTable())
{
@@ -691,7 +701,7 @@ namespace Sarand.Net.Standard.Dbas.Data
String value = row[col].ToString();
if (col.ColumnName.EqualsCI("ColumnName")) columnName = value;
else if (col.ColumnName.EqualsCI("IsIdentity")) isIdentity = value.ToBool();
//if (columnName.EqualsCI("CreateOn")) SaLogger.Debug(GetType().Name+".PopulateTableColumns Column name: " + col.ColumnName + " [" + value + "]");
//if (columnName.EqualsCI("CreateOn")) SaLogger.Debug($"{GetType().Name}.PopulateTableColumns Column name: {col.ColumnName} [{value}]");
}
DbDfnColumn columnDfn = table.Columns.GetColumnByName(columnName);
if (columnDfn != null)
@@ -800,7 +810,7 @@ namespace Sarand.Net.Standard.Dbas.Data
else if (colName.EqualsCI("FILTER_CONDITION") || colName.EqualsCI("FILTER"))
filterCondition = value;
//else SaLogger.Debug(GetType().Name+".PopulateTableIndices Unrecognised Schema column name: "+colName);
//SaLogger.Debug(GetType().Name+".PopulateTableIndices Column name: " + colName+", Value="+value);
//SaLogger.Debug($"{GetType().Name}.PopulateTableIndices Column name: {colName}, Value={value}");
}
//-------------------------------------------------------
@@ -837,14 +847,14 @@ namespace Sarand.Net.Standard.Dbas.Data
{
String colName = column.ColumnName;
String value = row[colName].ToString();
SaLogger.Debug(debugIndex + " Column: " + colName + ". Value: " + value);
SaLogger.Debug($"{debugIndex} Column: {colName}. Value: {value}");
}
}
//-------------------------------------------------------
if (!StringUtil.IsEmpty(indexName))
{
//SaLogger.Debug(GetType().Name+".PopulateTableIndices Database=" + database + ", Schema=" + schema + ", Table=" + tableName + ", Index="+indexName+", Column=" + columnName);
//SaLogger.Debug($"{GetType().Name}.PopulateTableIndices Database={database}, Schema={schema}, Table={tableName}, Index={indexName}, Column={columnName}");
// Retrieve index or populate if not found.
DbDfnIndex index = table.GetIndexByName(indexName);
if (index == null)
@@ -890,7 +900,7 @@ namespace Sarand.Net.Standard.Dbas.Data
String value = row[colName].ToString();
String constraintCatalog, constraintSchema, constraintName, tableCatalog, tableSchema, tableName, columnName, ordinalPosition, keyType, indexName;
#if DEBUG
//SaLogger.Trace(fn+" Column name=" + colName);
//SaLogger.Trace($"{SysUtil.Fn} Column name={colName}");
#endif
if (colName.EqualsCI("constraint_catalog"))
constraintCatalog = value;