Files
Common-VS2019/SacsStandardBase/Base/Dbas/DbResultSet.cs
T
2025-11-20 17:17:40 +00:00

182 lines
5.5 KiB
C#

using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using System;
namespace Sarand.Net.Standard.Base.Dbas
{
//=======================================================================
public abstract class DbResultSet : SacsDisposableStateItem, IDbResultSet
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
protected DbResultSet()
{
}
//-------------------------------------------------------------------
// Navigation.
public abstract bool NextRecord();
public abstract void Close();
//-------------------------------------------------------------------
// Properties.
public abstract int FieldCount { get; }
public bool IsValidColumn(int columnIdx)
{
return (columnIdx >= 0 && columnIdx < FieldCount);
}
public abstract bool HasRows { get; }
//-------------------------------------------------------------------
// Field Values.
public abstract int GetOrdinal(String columnName);
public abstract String GetDataTypeName(int columnIdx);
public abstract String GetName(int columnIdx);
public abstract bool IsDbNull(int columnIdx);
public abstract Object GetValue(int columnIdx);
public abstract bool GetBoolean(int columnIdx);
public abstract byte GetByte(int columnIdx);
public abstract short GetInt16(int columnIdx);
public abstract int GetInt32(int columnIdx);
public abstract long GetInt64(int columnIdx);
public abstract float GetFloat(int columnIdx);
public abstract double GetDouble(int columnIdx);
public abstract decimal GetDecimal(int columnIdx);
public abstract String GetString(int columnIdx);
public abstract DateTime GetDateTime(int columnIdx);
public abstract Guid GetGuid(int columnIdx);
//-------------------------------------------------------------------
// Get Field Value.
public DataValue GetFieldValue(String columnName)
{
String fn = $"{GetType().Name}.GetFieldValue('{columnName}')";
DataValue dataValue = null;
try
{
dataValue = GetFieldValue(GetOrdinal(columnName));
}
catch (Exception exc)
{
SaLogger.Warn($"{fn} {ExceptionUtil.GetErrorStateMessage(exc)}");
}
return dataValue;
}
#if DEBUG
private static bool handlingGetFieldValueException = false;
#endif
public DataValue GetFieldValue(int columnIdx)
{
String fn = $"{GetType().Name}.GetFieldValue('{columnIdx}')";
if (IsDbNull(columnIdx)) return null;
String columnDataType = "";
DataValue dataValue = null;
try
{
columnDataType = GetDataTypeName(columnIdx);
switch (columnDataType)
{
// Catering for c# (DataTableReader) and sql (DbDataReader) type names
case "bit":
case "Bool":
dataValue = new DataValue(GetBoolean(columnIdx));
break;
case "tinyint":
dataValue = new DataValue((long)GetByte(columnIdx));
break;
case "smallint":
case "Int16":
dataValue = new DataValue((long)GetInt16(columnIdx));
break;
case "int":
case "int identity":
case "Int32":
dataValue = new DataValue((long)GetInt32(columnIdx));
break;
case "bigint":
case "Int64":
dataValue = new DataValue((long)GetInt64(columnIdx));
break;
case "real":
case "float":
case "Float":
case "Single":
case "Double":
dataValue = new DataValue(GetDouble(columnIdx));
break;
case "decimal":
case "Decimal":
case "numeric":
case "Numeric":
dataValue = new DataValue(GetDecimal(columnIdx));
break;
case "char":
case "varchar":
case "nvarchar":
case "String":
dataValue = new DataValue(GetString(columnIdx));
break;
case "datetime":
case "DateTime":
case "smalldatetime":
case "SmallDateTime":
dataValue = new DataValue(GetDateTime(columnIdx));
break;
case "UniqueIdentifier":
dataValue = new DataValue(GetGuid(columnIdx));
break;
default:
SaLogger.Warn(fn + " Unrecognised data type '" + columnDataType + "' for column '" + GetName(columnIdx) + "'");
break;
}
}
catch (Exception exc)
{
SaLogger.Warn($"{fn} Data type: {columnDataType}. {ExceptionUtil.GetErrorStateMessage(exc)}");
#if DEBUG
if (!handlingGetFieldValueException)
{
// Reinvoke for debugging.
handlingGetFieldValueException = true;
DataValue value = GetFieldValue(columnIdx);
handlingGetFieldValueException = false;
}
#endif
}
return dataValue;
}
// Get Record Values.
public NamedValue.Map GetRecordValues()
{
NamedValue.Map values = null;
values = new NamedValue.Map();
for (int columnIdx = 0; columnIdx < FieldCount; columnIdx++)
{
String columnName = GetName(columnIdx);
DataValue dataValue = GetFieldValue(columnIdx);
if (dataValue != null)
values.AddValue(columnName, dataValue);
}
return values;
}
//-------------------------------------------------------------------
// Logging.
public static SaMessageLevel LoggingLevel { get; set; } = SaMessageLevel.None;
public static String LoggingPrefix { get; set; } = " ~~~ ";
protected static void Log(String fn, String message, SaMessageLevel level = SaMessageLevel.Debug)
{
if ((int)level > (int)LoggingLevel) return;
SaLogger.Log((fn + "\n\t" + message).Trim(), level);
}
//-------------------------------------------------------------------
}
//=======================================================================
}