16 Commits
v1.1 ... v1.3.1

Author SHA1 Message Date
Railz
ff6fb08a08 Fixed missing convertion 2019-04-08 20:35:12 +02:00
Railz
d2900f364d Set version 2019-04-08 20:33:05 +02:00
Railz
b014c2f392 Added Method to convert classField-names to according dbAttributes
Added convert in GetListByAttribute
2019-04-08 20:32:44 +02:00
Railz
0ad7221680 Set version 2019-04-08 19:45:47 +02:00
Railz
36da32f870 Added Select/DeleteByAttribute
Added GetListByAttribute
2019-04-08 19:45:04 +02:00
Railz
d8c9867e50 Set version 2019-04-08 13:54:24 +02:00
Railz
166956f10f Added SelectByAttribute and DeleteByAttribute to QueryBuilder 2019-04-08 13:49:11 +02:00
Alexander B
ddb7f6dc89 Fixed ResolveByPrimaryKey - queryExecutor to be able to return multiple rows (via List) 2019-04-02 13:31:26 +02:00
Alexander B
06aa7969bf Removed unesserary variable 2019-04-02 09:49:04 +02:00
Railz
fb6cf14402 Fixed ResolveByPrimaryKey not having runDataLossChecks implemented 2019-04-01 18:52:38 +02:00
Railz
e8e1fb993d Removed ignoreDataMismatch and implemented runDataLossChecks instead 2019-04-01 18:49:37 +02:00
Railz
8633ac1925 Changed wrong comment 2019-04-01 18:38:44 +02:00
Railz
8de75728e0 Fixed ClassAction not being public
Moved SqlSerialise to Function
2019-04-01 18:33:53 +02:00
Railz
0f38c92bbe Added ResolveByPrimaryKey 2019-04-01 17:33:16 +02:00
Railz
46e8ec1180 New Function-class
Changed some references to new Function-class
Added ClassAction.FillObject
Added ClassAction.FillObject
Renamed unecessary plural names to singular
2019-04-01 17:26:30 +02:00
Railz
97b7eaeffe Added comments
Added check if given class is invalid
Changed BuildQuery to support recursive object[] copying
Changed structure
Added DbFunction to handle all Db-related stuff
2019-04-01 16:25:02 +02:00
7 changed files with 424 additions and 145 deletions

View File

@@ -0,0 +1,121 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace eu.railduction.netcore.dll.Database_Attribute_System
{
public class ClassAction
{
/// <summary>
/// Fills an given dbObject with given data<para/>
/// Data-attribute-names and class-fieldNames have to match! (non case-sensitive)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="data">The data</param>
/// <param name="runDataLossChecks">This checks if any class-field and data-attribute does not exists in either (Slower)</param>
public static void FillObject<T>(T classObject, Dictionary<string, object> data, bool runDataLossChecks = true)
{
Type classType = classObject.GetType();
string tableName = Function.GetDbTableName(classType);
// Get class-fields
Dictionary<string, FieldInfo> dbFields = Function.ReadDbClassFields(classType);
if (runDataLossChecks)
{
// Check every data-attribute for match in class-fields
foreach (KeyValuePair<string, object> data_keySet in data)
{
bool isFound = false;
foreach (KeyValuePair<string, FieldInfo> field_keySet in dbFields)
{
if (field_keySet.Key.ToLower() == data_keySet.Key.ToLower())
isFound = true;
}
if (!isFound)
throw new InvalidOperationException($"Could not fill object. Data-Attribute '{data_keySet.Key}' was not found in class!");
}
// Check every class-field for match in data-attributes
foreach (KeyValuePair<string, FieldInfo> field_keySet in dbFields)
{
bool isFound = false;
foreach (KeyValuePair<string, object> data_keySet in data)
{
if (field_keySet.Key.ToLower() == data_keySet.Key.ToLower())
isFound = true;
}
if (!isFound)
throw new InvalidOperationException($"Could not fill object. Class-field '{field_keySet.Key}' was not found in data!");
}
}
// Iterate through data
foreach (KeyValuePair<string, object> data_keySet in data)
{
// Interate through class-fields
foreach (KeyValuePair<string, FieldInfo> field_keySet in dbFields)
{
// If its a match, set the value
if (field_keySet.Key.ToLower() == data_keySet.Key.ToLower())
{
field_keySet.Value.SetValue(classObject, data_keySet.Value);
break;
}
}
}
}
/// <summary>
/// Resolves an object with the database<para/>
/// Needs to have primaryKey/s-value/s set!<para/>
/// - Generates an query<para/>
/// - Sends an query via Func<para/>
/// - Fills the object with data
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue]</param>
/// <param name="runDataLossChecks">This checks if any class-field and data-attribute does not exists in either (Slower)</param>
public static void ResolveByPrimaryKey<T>(T classObject, Func<string, List<Dictionary<string, object>>> queryExecutor, bool runDataLossChecks = true)
{
string query = QueryBuilder.SelectByPrimaryKey(classObject); // Generate query
List<Dictionary<string, object>> dataSet = queryExecutor(query); // Execute
FillObject(classObject, dataSet[0], runDataLossChecks); // Fill the object
}
/// <summary>
/// Gets a list of dbObjects by attribute/s
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classType">Type of class</param>
/// <param name="fields">class-fields for select</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue]</param>
/// <param name="runDataLossChecks">This checks if any class-field and data-attribute does not exists in either (Slower)</param>
/// <returns></returns>
public static List<T> GetListByAttribute<T>(Type classType, Dictionary<string, object> fields, Func<string, List<Dictionary<string, object>>> queryExecutor, bool runDataLossChecks = true) where T : new()
{
string tableName = Function.GetDbTableName(classType); // Get database-tableName
Function.ConvertAttributeToDbAttributes(classType, fields);
string query = QueryBuilder.SelectByAttribute(tableName, fields); // Generate query
List<Dictionary<string, object>> dataSet = queryExecutor(query); // Execute
List<T> objs = new List<T>() { };
foreach(Dictionary<string, object> data in dataSet)
{
T obj = new T(); // New object
FillObject(obj, data, runDataLossChecks); // Fill it
objs.Add(obj); // Add to list
}
return objs; // Return list
}
}
}

View File

@@ -4,6 +4,7 @@
<TargetFramework>netcoreapp2.1</TargetFramework>
<RootNamespace>eu.railduction.netcore.dll.Database_Attribute_System</RootNamespace>
<SignAssembly>false</SignAssembly>
<Version>1.3.1</Version>
</PropertyGroup>
</Project>

View File

@@ -1,86 +0,0 @@
using eu.railduction.netcore.dll.Database_Attribute_System.Attributes;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace eu.railduction.netcore.dll.Database_Attribute_System
{
class Function
{
public static string SqlEscape(string str)
{
string str_cpy = str.Replace(@"'", @"\'");
return str_cpy;
}
public static string SqlSerialise(DateTime dt)
{
return dt.ToString("yyyy-MM-dd HH:mm:ss");
}
public static object[] BuildKeyEqualQuery(Dictionary<string, object> keysets, string seperator)
{
object[] param = new object[keysets.Count * 2];
int c = 0;
foreach (KeyValuePair<string, object> keyset in keysets)
{
string sql_string = "";
if (c != 0) sql_string += seperator;
sql_string += $"{keyset.Key}=";
param[c] = sql_string;
param[c + 1] = keyset.Value;
c += 2;
}
return param;
}
public static string GetDbTableName(Type classType)
{
// Check if class has attribute 'DbObject' and get the database table-name
if (!(classType.GetCustomAttribute(typeof(DbObject), true) is DbObject dbObjectAttribute)) throw new InvalidOperationException("Cannot generate SQL-Query of class. Missing Attribute 'DbObject'");
string tableName = dbObjectAttribute._tableName ?? classType.Name; // If no alternative table-name is specified, use the class-name
return tableName;
}
public static void ReadDbClassFields<T>(T classObject, ref Dictionary<string, object> dbPrimaryKeys, ref Dictionary<string, object> dbAttributes, ref Dictionary<string, object> dbForeignKeys)
{
Type classType = typeof(T);
// Reset lists (just in case)
dbPrimaryKeys = new Dictionary<string, object> () { };
dbAttributes = new Dictionary<string, object>() { };
dbForeignKeys = new Dictionary<string, object>() { };
// Iterate thru all properties
foreach (System.Reflection.FieldInfo fi in classType.GetRuntimeFields())
{
// Check if current field is a db-field
if (fi.GetCustomAttribute(typeof(DbPrimaryKey), true) is DbPrimaryKey pkey) // PrimaryKey
{
string dbAttributeName = pkey._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
object value = fi.GetValue(classObject);
dbPrimaryKeys.Add(dbAttributeName, value);
}
else if (fi.GetCustomAttribute(typeof(DbAttribute), true) is DbAttribute att) // Attributes
{
string dbAttributeName = att._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
object value = fi.GetValue(classObject);
dbAttributes.Add(dbAttributeName, value);
}
else if (fi.GetCustomAttribute(typeof(DbForeignKey), true) is DbForeignKey fkey) // ForeignKeys
{
string dbAttributeName = fkey._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
object value = fi.GetValue(classObject);
dbForeignKeys.Add(dbAttributeName, value);
}
}
}
}
}

View File

@@ -7,7 +7,14 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
{
public class QueryBuilder
{
public static string SelectByPrimaryKeys<T>(T classObject)
/// <summary>
/// Builds an SELECT-Sql-query based on an object
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="tableName">The db-table-name</param>
/// <returns>SELECT-Sql-query</returns>
public static string SelectByPrimaryKey<T>(T classObject)
{
Type classType = classObject.GetType();
@@ -19,18 +26,47 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
Dictionary<string, object> dbAttributes = new Dictionary<string, object>() { };
Dictionary<string, object> dbForeignKeys = new Dictionary<string, object>() { };
Function.ReadDbClassFields(classObject, ref dbPrimaryKeys, ref dbAttributes, ref dbForeignKeys);
if (dbPrimaryKeys.Count == 0) throw new InvalidOperationException($"Cannot generate SQL-Query of '{classType.Name}'. No primary-key/s found!");
return SelectByAttribute(tableName, dbPrimaryKeys);
}
/// <summary>
/// Builds an SELECT-Sql-query based on an object<para/>
/// Object needs to have at least 1 attribute!
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tableName">The db-table-name</param>
/// <param name="dbAttributes">The db-attributes with dbAttribute-name and value<para/>If null is given, it will generate a default 'SELECT * FROM tableName'</param>
/// <returns>SELECT-Sql-query</returns>
public static string SelectByAttribute(string tableName, Dictionary<string, object> dbAttributes = null)
{
object[] param = new object[1];
if (dbAttributes != null)
{
// Build where statements with primaryKey/s
object[] param = Function.BuildKeyEqualQuery(dbPrimaryKeys, " AND ");
param = DbFunction.BuildKeyEqualQuery(dbAttributes, " AND ");
}
string sqlCmd = $"SELECT * FROM {tableName}";
// Add SQL-command part
param[0] = $"SELECT * FROM {tableName} WHERE "+ param[0];
if (dbAttributes != null)
param[0] = $"{sqlCmd} WHERE {param[0]}";
else
param[0] = sqlCmd;
// Build and return the query
return BuildQuery(param);
}
public static string UpdateByPrimaryKeys<T>(T classObject)
/// <summary>
/// Builds an UPDATE-Sql-query based on an object<para/>
/// Object needs to have at least 1 primary-key!
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <returns>UPDATE-Sql-query</returns>
public static string UpdateByPrimaryKey<T>(T classObject)
{
Type classType = classObject.GetType();
@@ -42,6 +78,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
Dictionary<string, object> dbAttributes = new Dictionary<string, object>() { };
Dictionary<string, object> dbForeignKeys = new Dictionary<string, object>() { };
Function.ReadDbClassFields(classObject, ref dbPrimaryKeys, ref dbAttributes, ref dbForeignKeys);
if (dbPrimaryKeys.Count == 0) throw new InvalidOperationException($"Cannot generate SQL-Query of '{classType.Name}'. No primary-key/s found!");
// Add foreign-keys to attributes
foreach (KeyValuePair<string, object> dbForeignKey in dbForeignKeys)
@@ -50,12 +87,12 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
}
// Build set-parameters
object[] paramSet = Function.BuildKeyEqualQuery(dbAttributes, ", ");
object[] paramSet = DbFunction.BuildKeyEqualQuery(dbAttributes, ", ");
// Add SQL-command part
paramSet[0] = $"UPDATE {tableName} SET "+ paramSet[0];
// Build where-parameters
object[] paramWhere = Function.BuildKeyEqualQuery(dbPrimaryKeys, " AND ");
object[] paramWhere = DbFunction.BuildKeyEqualQuery(dbPrimaryKeys, " AND ");
// Add SQL-command part
paramWhere[0] = " WHERE "+ paramWhere[0];
@@ -63,7 +100,14 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
return BuildQuery(paramSet, paramWhere);
}
public static string DeleteByPrimaryKeys<T>(T classObject)
/// <summary>
/// Builds an DELETE-Sql-query based on an object<para/>
/// Object needs to have at least 1 primary-key!
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <returns>DELETE-Sql-query</returns>
public static string DeleteByPrimaryKey<T>(T classObject)
{
Type classType = classObject.GetType();
@@ -75,40 +119,50 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
Dictionary<string, object> dbAttributes = new Dictionary<string, object>() { };
Dictionary<string, object> dbForeignKeys = new Dictionary<string, object>() { };
Function.ReadDbClassFields(classObject, ref dbPrimaryKeys, ref dbAttributes, ref dbForeignKeys);
// Build where-parameters
object[] paramWhere = Function.BuildKeyEqualQuery(dbPrimaryKeys, " AND ");
// Add SQL-command part
paramWhere[0] = $"DELETE FROM {tableName} WHERE "+ paramWhere[0];
if (dbPrimaryKeys.Count == 0) throw new InvalidOperationException($"Cannot generate SQL-Query of '{classType.Name}'. No primary-key/s found!");
// Build and return the query
return BuildQuery(paramWhere);
return DeleteByAttribute(tableName, dbPrimaryKeys);
}
public static string DeleteByAttribute(string tableName, Dictionary<string, object> dbAttributes = null)
{
object[] param = new object[1];
if (dbAttributes != null)
{
// Build where statements with primaryKey/s
param = DbFunction.BuildKeyEqualQuery(dbAttributes, " AND ");
}
string sqlCmd = $"DELETE FROM {tableName}";
// Add SQL-command part
if (dbAttributes != null)
param[0] = $"{sqlCmd} WHERE {param[0]}";
else
param[0] = sqlCmd;
// Build and return the query
return BuildQuery(param);
}
/// <summary>
/// Build an SQL-query<para/>
/// Will build the query-string based on the <paramref name="param"/>s including serialising and escaping for SQL.<para/>
/// (Supported-Types: null, string, byte, int, float, double, DateTime, Guid)
/// </summary>
/// <param name="param">Params with alternating query-parts and objects beginning with a query-part
/// <para/>Example: "SELECT * FROM table WHERE id=", id, " AND name=", name</param>
/// <para/>Example: "SELECT * FROM table WHERE id=", id, " AND name=", name<para/>
/// Info: Any object[] will be opened recursively and added as <paramref name="param"/> accordingly!
/// </param>
public static string BuildQuery(params object[] param)
{
// Convert array to list and add object[] to it accordingly
// Convert array to list and add object[] to it recursively
List<object> paramz = new List<object>() { };
foreach (object obj in param)
{
if (!(obj is object[]))
paramz.Add(obj);
else
{
foreach (object obj2 in (object[])obj)
{
paramz.Add(obj2);
}
}
}
Function.RecursiveParameterCopying(ref paramz, (object[])param);
string query = "";
for (int i = 0; i < paramz.Count; i++)
@@ -116,33 +170,9 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
if (i % 2 == 0) query += paramz[i]; // Every 'even' count will just add
else // Every 'uneven' count will handle param as passed variable
{
string paramString = "";
if (paramz[i] == null) // Handle null
{
paramString = "null";
}
else if (paramz[i].GetType() == typeof(string)) // Handle strings
{
paramString = "'" + Function.SqlEscape((string)paramz[i]) + "'"; // wrap in sql-brackets and escape sql, if any
}
else if (paramz[i].GetType() == typeof(int) || paramz[i].GetType() == typeof(float) || paramz[i].GetType() == typeof(double)) // Handle int, float & double
{
paramString = paramz[i].ToString().Replace(",", "."); // just format to string and form comma to sql-comma
}
else if (paramz[i].GetType() == typeof(DateTime)) // Handle DateTime
{
DateTime dateTime = (DateTime)paramz[i];
paramString = "'" + Function.SqlSerialise(dateTime) + "'"; // wrap in sql-brackets and convert to sql-datetime
}
else if (paramz[i].GetType() == typeof(Guid)) // Handle DateTime
{
string guid = ((Guid)paramz[i]).ToString(); // Get Guid as string
paramString = "'" + guid + "'"; // wrap in sql-brackets
}
else // Unknown type in params
{
throw new Exception($"Error in query-builder: Type '{paramz[i].GetType().ToString()}' cannot be used!");
}
string paramString = Function.SqlSerialise(paramz[i]);
if(paramString == null) // Unknown type in params
throw new Exception($"Error in query-builder. Type '{paramz[i].GetType().ToString()}' cannot be serialised!");
// Add formed param to query
query += paramString;

View File

@@ -0,0 +1,31 @@
using eu.railduction.netcore.dll.Database_Attribute_System.Attributes;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace eu.railduction.netcore.dll.Database_Attribute_System
{
class DbFunction
{
internal static object[] BuildKeyEqualQuery(Dictionary<string, object> keysets, string seperator)
{
object[] param = new object[keysets.Count * 2];
int c = 0;
foreach (KeyValuePair<string, object> keyset in keysets)
{
string sql_string = "";
if (c != 0) sql_string += seperator;
sql_string += $"{keyset.Key}=";
param[c] = sql_string;
param[c + 1] = keyset.Value;
c += 2;
}
return param;
}
}
}

View File

@@ -0,0 +1,182 @@
using eu.railduction.netcore.dll.Database_Attribute_System.Attributes;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace eu.railduction.netcore.dll.Database_Attribute_System
{
internal class Function
{
public static string SqlEscape(string str)
{
string str_cpy = str.Replace(@"'", @"\'");
return str_cpy;
}
public static string SqlSerialise(DateTime dt, string format = "yyyy-MM-dd HH:mm:ss")
{
return dt.ToString(format);
}
// Recursive object[] copying
internal static void RecursiveParameterCopying(ref List<object> paramz, object[] objects)
{
foreach (object obj in objects)
{
if (!(obj is object[]))
paramz.Add(obj);
else
RecursiveParameterCopying(ref paramz, (object[])obj);
}
}
internal static void ConvertAttributeToDbAttributes(Type classType, Dictionary<string, object> attributeNameAndValues)
{
Dictionary<string, FieldInfo> classFields = ReadDbClassFields(classType);
foreach (KeyValuePair<string, object> attributeNameAndValue in attributeNameAndValues)
{
bool nameFound = false;
foreach (KeyValuePair<string, FieldInfo> classField in classFields)
{
if (attributeNameAndValue.Key.ToLower() == classField.Value.Name.ToLower())
{
attributeNameAndValues.Remove(attributeNameAndValue.Key);
attributeNameAndValues.Add(classField.Key, attributeNameAndValue.Value);
nameFound = true;
break;
}
}
if (!nameFound) throw new InvalidOperationException($"{attributeNameAndValue.Key} has no classField!");
}
}
internal static void ConvertAttributeToDbAttributes(Type classType, List<string> attributeNames)
{
Dictionary<string, FieldInfo> classFields = ReadDbClassFields(classType);
List<string> dbAttributes = new List<string>() { };
for(int i=0; i< attributeNames.Count; i++)
{
bool nameFound = false;
foreach (KeyValuePair<string, FieldInfo> classField in classFields)
{
if(attributeNames[i].ToLower() == classField.Value.Name.ToLower())
{
attributeNames[i] = classField.Key;
nameFound = true;
break;
}
}
if (!nameFound) throw new InvalidOperationException($"{attributeNames[i]} has no classField!");
}
}
internal static void ReadDbClassFields<T>(T classObject, ref Dictionary<string, object> dbPrimaryKeys, ref Dictionary<string, object> dbAttributes, ref Dictionary<string, object> dbForeignKeys)
{
Type classType = typeof(T);
// Reset lists (just in case)
dbPrimaryKeys = new Dictionary<string, object>() { };
dbAttributes = new Dictionary<string, object>() { };
dbForeignKeys = new Dictionary<string, object>() { };
// Iterate thru all properties
foreach (System.Reflection.FieldInfo fi in classType.GetRuntimeFields())
{
// Check if current field is a db-field
if (fi.GetCustomAttribute(typeof(DbPrimaryKey), true) is DbPrimaryKey pkey) // PrimaryKey
{
string dbAttributeName = pkey._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
object value = fi.GetValue(classObject);
dbPrimaryKeys.Add(dbAttributeName, value);
}
else if (fi.GetCustomAttribute(typeof(DbAttribute), true) is DbAttribute att) // Attributes
{
string dbAttributeName = att._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
object value = fi.GetValue(classObject);
dbAttributes.Add(dbAttributeName, value);
}
else if (fi.GetCustomAttribute(typeof(DbForeignKey), true) is DbForeignKey fkey) // ForeignKeys
{
string dbAttributeName = fkey._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
object value = fi.GetValue(classObject);
dbForeignKeys.Add(dbAttributeName, value);
}
}
}
internal static Dictionary<string, FieldInfo> ReadDbClassFields(Type classType)
{
Dictionary<string, FieldInfo> dbFields = new Dictionary<string, FieldInfo>();
// Iterate thru all properties
foreach (System.Reflection.FieldInfo fi in classType.GetRuntimeFields())
{
// Check if current field is a db-field
if (fi.GetCustomAttribute(typeof(DbPrimaryKey), true) is DbPrimaryKey pkey) // PrimaryKey
{
string dbAttributeName = pkey._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
dbFields.Add(dbAttributeName, fi);
}
else if (fi.GetCustomAttribute(typeof(DbAttribute), true) is DbAttribute att) // Attributes
{
string dbAttributeName = att._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
dbFields.Add(dbAttributeName, fi);
}
else if (fi.GetCustomAttribute(typeof(DbForeignKey), true) is DbForeignKey fkey) // ForeignKeys
{
string dbAttributeName = fkey._attributeName ?? fi.Name; // If no alternative attribute-name is specified, use the property-name
dbFields.Add(dbAttributeName, fi);
}
}
return dbFields;
}
public static string GetDbTableName(Type classType)
{
// Check if class has attribute 'DbObject' and get the database table-name
if (!(classType.GetCustomAttribute(typeof(DbObject), true) is DbObject dbObjectAttribute)) throw new InvalidOperationException($"Cannot generate SQL-Query of '{classType.Name}'. Missing Attribute 'DbObject'");
string tableName = dbObjectAttribute._tableName ?? classType.Name; // If no alternative table-name is specified, use the class-name
return tableName;
}
public static string SqlSerialise(object obj)
{
if (obj == null) // Handle null
{
return "null";
}
else if (obj.GetType() == typeof(string)) // Handle strings
{
return "'" + SqlEscape((string)obj) + "'"; // wrap in sql-brackets and escape sql, if any
}
else if (obj.GetType() == typeof(byte) || obj.GetType() == typeof(int) || obj.GetType() == typeof(float) || obj.GetType() == typeof(double)) // Handle int, float & double
{
return obj.ToString().Replace(",", "."); // just format to string and form comma to sql-comma
}
else if (obj.GetType() == typeof(DateTime)) // Handle DateTime
{
DateTime dateTime = (DateTime)obj;
return "'" + SqlSerialise(dateTime) + "'"; // wrap in sql-brackets and convert to sql-datetime
}
else if (obj.GetType() == typeof(Guid)) // Handle DateTime
{
string guid = ((Guid)obj).ToString(); // Get Guid as string
return "'" + guid + "'"; // wrap in sql-brackets
}
else
{
return null;
}
}
}
}