internal static string GetObjectQueryValue(this DirectDatabaseBase db, PropertyInfo obj, DirectModelPropertySignature signature, object parentObject)
        {
            var model = parentObject as DirectModel;

            if (obj == null)
            {
                return("NULL");
            }

            if (signature.UpdateDateTime)
            {
                if (db != null)
                {
                    return(db.CurrentDateQueryString);
                }
                else
                {
                    return("CURRENT_TIMESTAMP");
                }
            }


            object value = obj.GetValue(parentObject);
            var    type  = obj.PropertyType;

            if (type == typeof(DirectTime))
            {
                return(db.CurrentDateQueryString);
            }
            else if (type == typeof(DirectScopeID))
            {
                return(db.QueryScopeID);
            }
            else if (type == typeof(bool))
            {
                return((bool)value ? "1" : "0");
            }
            else if (type == typeof(int) || type == typeof(double) || type == typeof(long) ||
                     type == typeof(uint) || type == typeof(ulong) || type == typeof(short) ||
                     type == typeof(int?) || type == typeof(double?) || type == typeof(long?) ||
                     type == typeof(uint?) || type == typeof(ulong?) || type == typeof(short?))
            {
                return(value.ToString());
            }
            else if (type == typeof(string) || type == typeof(Guid) || type == typeof(String) || type == typeof(char))
            {
                string extra = model.GetDatabase().DatabaseType == DirectDatabaseType.SQLServer ? "N" : ""; // for adding utf8 data
                return(string.Format(extra + "'{0}'", value.ToString().EscapeString()));
            }
            else if (type == typeof(byte[]))
            {
                byte[] data         = (byte[])value;
                bool   hasAllZeroes = data.All(singleByte => singleByte == 0);
                if (hasAllZeroes)
                {
                    return("NULL");
                }
                string hex = StringToHex.ToHexString(data, false);
                //data.ToList().ForEach(b => hex += b.ToString("x2"));
                return(string.Format("X'{0}'", hex));
            }
            else if (type == typeof(DateTime) || type == typeof(DateTime?))
            {
                if (value == null)
                {
                    return("NULL");
                }

                DateTime?dt = value as DateTime?;
                if (dt != null)
                {
                    if (db != null)
                    {
                        return(db.ConstructDateTimeParam(dt.Value));
                    }
                    else
                    {
                        return(string.Format("'{0}'", dt.Value.ToString("yyyy-MM-dd HH:mm:ss")));
                    }
                }
                else
                {
                    return("NULL");
                }
            }

            return("NULL");
        }
        internal static string GetObjectQueryValue(this DirectDatabaseBase db, object obj)
        {
            if (obj == null)
            {
                return("NULL");
            }

            var type = obj.GetType();

            if (type == typeof(DirectTime))
            {
                return(db.CurrentDateQueryString);
            }
            else if (type == typeof(DirectScopeID))
            {
                return(db.QueryScopeID);
            }
            else if (type == typeof(int) || type == typeof(double) || type == typeof(long) ||
                     type == typeof(uint) || type == typeof(ulong) || type == typeof(short))
            {
                return(obj.ToString());
            }
            else if (type == typeof(string) || type == typeof(String) || type == typeof(char))
            {
                return(string.Format("'{0}'", obj.ToString().EscapeString()));
            }
            else if (type == typeof(bool))
            {
                return((bool)obj == true ? "1" : "0");
            }
            else if (type == typeof(string[]) || type == typeof(List <string>))
            {
                string value = "";
                if (type == typeof(List <string>))
                {
                    obj = ((List <string>)obj).ToArray();                      // convert it first to array so we can easly work with it
                }
                foreach (string a in (string[])obj)
                {
                    value += (!string.IsNullOrEmpty(value) ? "," : "") + string.Format("'{0}'", a.EscapeString());
                }
                return(value);
            }
            else if (type == typeof(int[]) || type == typeof(List <int>))
            {
                string value = "";
                if (type == typeof(List <int>))
                {
                    obj = ((List <int>)obj).ToArray();                   // convert it first to array so we can easly work with it
                }
                foreach (int a in (int[])obj)
                {
                    value += (!string.IsNullOrEmpty(value) ? "," : "") + a;
                }
                return(value);
            }
            else if (type == typeof(DateTime))
            {
                DateTime?dt = obj as DateTime?;
                if (dt != null)
                {
                    return(db.ConstructDateTimeParam(dt.Value));
                }
                else
                {
                    return("NULL");
                }
            }

            return("NULL");
        }