private static ParamBinding BuildParamFromSimpleType(object param, Type paramType)
        {
            var underlyingType = Nullable.GetUnderlyingType(paramType);

            if (underlyingType != null)
            {
                paramType = underlyingType;
            }

            var stringValue = param == null ? null : string.Format(CultureInfo.InvariantCulture, "{0}", param);

            if (TextTypes.Contains(paramType))
            {
                return new ParamBinding()
                       {
                           Type = "TEXT", Value = stringValue
                       }
            }
            ;

            if (FixedTypes.Contains(paramType))
            {
                return new ParamBinding()
                       {
                           Type = "FIXED", Value = stringValue
                       }
            }
            ;

            if (paramType == typeof(bool))
            {
                return new ParamBinding()
                       {
                           Type = "BOOLEAN", Value = stringValue
                       }
            }
            ;

            if (RealTypes.Contains(paramType))
            {
                return new ParamBinding()
                       {
                           Type = "REAL", Value = stringValue
                       }
            }
            ;

            if (paramType == typeof(DateTime))
            {
                return new ParamBinding()
                       {
                           Type  = "TIMESTAMP_NTZ",
                           Value = param == null ? null : SnowflakeTypesConverter.ConvertToTimestampNtz((DateTime)param)
                       }
            }
            ;

            if (paramType == typeof(DateTimeOffset))
            {
                return new ParamBinding()
                       {
                           Type  = "TIMESTAMP_TZ",
                           Value = param == null ? null : SnowflakeTypesConverter.ConvertToTimestampTz((DateTimeOffset)param)
                       }
            }
            ;

            if (paramType == typeof(byte[]))
            {
                return new ParamBinding()
                       {
                           Type  = "BINARY",
                           Value = param == null ? null : SnowflakeTypesConverter.BytesToHex((byte[])param)
                       }
            }
            ;

            return(null);
        }
        private static string ConvertColumnValueToJsonToken(string value, string columnType)
        {
            if (value == null || value == "null")
            {
                return("null");
            }

            if (columnType == "text")
            {
                return(JsonSerializer.Serialize(value));
            }

            var sfSemiStructuredTypes = new List <string>()
            {
                "object", "variant", "array"
            };

            if (sfSemiStructuredTypes.Contains(columnType))
            {
                return(value);
            }

            var sfSimpleTypes = new List <string>()
            {
                "fixed", "real"
            };

            if (sfSimpleTypes.Contains(columnType))
            {
                return(value);
            }

            if (columnType == "boolean")
            {
                return(value == "1" || value == "true" ? "true" : "false");
            }

            var sfDateTimeOffsetTypes = new List <string>()
            {
                "timestamp_ltz", "timestamp_tz"
            };

            if (sfDateTimeOffsetTypes.Contains(columnType))
            {
                return('"' + SnowflakeTypesConverter.ConvertToDateTimeOffset(value, columnType).ToString("o") + '"');
            }

            var sfDateTimeTypes = new List <string>()
            {
                "date", "time", "timestamp_ntz"
            };

            if (sfDateTimeTypes.Contains(columnType))
            {
                return('"' + SnowflakeTypesConverter.ConvertToDateTime(value, columnType).ToString("o") + '"');
            }

            if (columnType == "binary")
            {
                var bytes  = SnowflakeTypesConverter.HexToBytes(value);
                var base64 = Convert.ToBase64String(bytes);
                return('"' + base64 + '"');
            }

            return('"' + value + '"');
        }