protected virtual SqlParameter AddSqlParameter(SqlStatement sqlStatement, IList parameters, string paramName, object obj, IPropertyMap propertyMap, object value, IColumnMap columnMap, bool noNullStatusCheck)
		{
			DbType dataType = columnMap.DataType;
			IPropertyMap idPropertyMap;
			IObjectManager om = m_SqlEngineManager.Context.ObjectManager;
			IClassMap refClassMap;
			IColumnMap forColMap;
			IClassMap realRefClassMap;
			IQueryParameter param = new QueryParameter(paramName, columnMap.DataType) ;
			parameters.Add(param);
			SqlParameter sqlParameter = sqlStatement.AddSqlParameter(paramName, dataType);
			if (Convert.IsDBNull(value) || value == null)
			{
				param.Value = DBNull.Value;
			}
			if (!(noNullStatusCheck))
			{
				if (om.GetNullValueStatus(obj, propertyMap.Name))
				{
					param.Value = DBNull.Value;
					sqlParameter.Value = DBNull.Value;
					return sqlParameter;
				}				
			}
			if (propertyMap != null)
			{
				if (!(propertyMap.ReferenceType == ReferenceType.None))
				{
					if (value == null)
					{
						param.Value = DBNull.Value;
						sqlParameter.Value = DBNull.Value;
						return sqlParameter;
					}
					else
					{
						if (om.GetObjectStatus(value) == ObjectStatus.UpForCreation)
						{
							param.Value = DBNull.Value;
							sqlParameter.Value = DBNull.Value;
							return sqlParameter;
						}
						else
						{
							refClassMap = propertyMap.MustGetReferencedClassMap();
							forColMap = columnMap.MustGetPrimaryKeyColumnMap();
							dataType = forColMap.DataType;
							if (refClassMap.GetTypeColumnMap() != null && refClassMap.GetTypeColumnMap() == forColMap)
							{
								realRefClassMap = refClassMap.DomainMap.MustGetClassMap(value.GetType());
								value = realRefClassMap.TypeValue;
							}
							else
							{
								idPropertyMap = refClassMap.MustGetPropertyMapForColumnMap(forColMap);
								value = om.GetPropertyValue(value, idPropertyMap.Name);
							}
						}
					}
				}
			}
			param.Value = value;
			sqlParameter.Value = value;
			return sqlParameter;
		}
		protected virtual string WrapValue(object obj, IPropertyMap propertyMap, object value, IColumnMap columnMap, ref string compareOp, bool noNullStatusCheck)
		{
			string dateFormat;
			DbType dataType = columnMap.DataType;
			IPropertyMap idPropertyMap;
			IObjectManager om = m_SqlEngineManager.Context.ObjectManager;
			IClassMap refClassMap;
			IColumnMap forColMap;
			IClassMap realRefClassMap;
			compareOp = "=";
			if (Convert.IsDBNull(value) || value == null)
			{
				compareOp = "Is";
				return "NULL";
			}
			if (!(noNullStatusCheck))
			{
				if (om.GetNullValueStatus(obj, propertyMap.Name))
				{
					compareOp = "Is";
					return "NULL";		
				}				
			}
			if (propertyMap != null)
			{
				if (!(propertyMap.ReferenceType == ReferenceType.None))
				{
					if (value == null)
					{
						compareOp = "Is";
						return "NULL";
					}
					else
					{
						if (om.GetObjectStatus(value) == ObjectStatus.UpForCreation)
						{
							compareOp = "Is";
							return "NULL";
						}
						else
						{
							refClassMap = propertyMap.MustGetReferencedClassMap();
							forColMap = columnMap.MustGetPrimaryKeyColumnMap();
							dataType = forColMap.DataType;

							IColumnMap typeColumnMap = refClassMap.GetTypeColumnMap();
							if (typeColumnMap != null && typeColumnMap == forColMap)
							{
								realRefClassMap = refClassMap.DomainMap.MustGetClassMap(value.GetType());
								value = realRefClassMap.TypeValue;
							}
							else
							{
								idPropertyMap = refClassMap.MustGetPropertyMapForColumnMap(forColMap);
								value = om.GetPropertyValue(value, idPropertyMap.Name);
							}
						}
					}
				}
			}
			if (dataType == DbType.AnsiString || dataType == DbType.AnsiStringFixedLength || dataType == DbType.String || dataType == DbType.StringFixedLength)
			{
				if (columnMap.Precision == 0 || columnMap.Precision >= 4000)
				{
					compareOp = "LIKE";
				}
				return "'" + Convert.ToString(value).Replace("'", "''") + "'";
			}
			else if (dataType == DbType.Date || dataType == DbType.DateTime || dataType == DbType.Time)
			{
				dateFormat = columnMap.Format;
				if (dateFormat == "")
				{
					dateFormat = "yyyy-MM-dd HH:mm:ss"; // do not localize
				}
				return DateDelimiter + Convert.ToDateTime(value).ToString(dateFormat) + DateDelimiter;
			}
			else if (dataType == DbType.Byte || dataType == DbType.Decimal || dataType == DbType.Double || dataType == DbType.Int16 || dataType == DbType.Int32 || dataType == DbType.Int64 || dataType == DbType.SByte || dataType == DbType.Single || dataType == DbType.UInt16 || dataType == DbType.UInt32 || dataType == DbType.UInt64 || dataType == DbType.VarNumeric)
			{
				return Convert.ToString(value).Replace(",", ".");
			}
			else if (dataType == DbType.Boolean)
			{
				return WrapBoolean(Convert.ToBoolean(value));
			}
			else if (dataType == DbType.Currency)
			{
				return Convert.ToString(value).Replace(",", ".");
			}
			else if (dataType == DbType.Binary)
			{
				return "";
			}
			else if (dataType == DbType.Guid)
			{
				return "'" + Convert.ToString(value).Replace("'", "''") + "'";
			}
			else if (dataType == DbType.Object)
			{
				return "";
			}
			else
			{
				return Convert.ToString(value);
			}
		}
		protected virtual void AddParameter(IList parameters, string paramName, object obj, IPropertyMap propertyMap, object value, IColumnMap columnMap, ref string compareOp, bool noNullStatusCheck)
		{
			DbType dataType = columnMap.DataType;
			IPropertyMap idPropertyMap;
			IObjectManager om = m_SqlEngineManager.Context.ObjectManager;
			IClassMap refClassMap;
			IColumnMap forColMap;
			IClassMap realRefClassMap;
			IQueryParameter param = new QueryParameter(paramName, columnMap.DataType) ;
			parameters.Add(param);
			compareOp = "=";
			if (Convert.IsDBNull(value) || value == null)
			{
				//compareOp = "Is";
				param.Value = DBNull.Value;
				return;
			}
			if (!(noNullStatusCheck))
			{
				if (om.GetNullValueStatus(obj, propertyMap.Name))
				{
					//compareOp = "Is";
					param.Value = DBNull.Value;
					return;
				}				
			}
			if (propertyMap != null)
			{
				if (!(propertyMap.ReferenceType == ReferenceType.None))
				{
					if (value == null)
					{
						//compareOp = "Is";
						param.Value = DBNull.Value;
						return;
					}
					else
					{
						if (om.GetObjectStatus(value) == ObjectStatus.UpForCreation)
						{
							//compareOp = "Is";
							param.Value = DBNull.Value;
							return;
						}
						else
						{
							refClassMap = propertyMap.MustGetReferencedClassMap();
							forColMap = columnMap.MustGetPrimaryKeyColumnMap();
							dataType = forColMap.DataType;
							if (refClassMap.GetTypeColumnMap() != null && refClassMap.GetTypeColumnMap() == forColMap)
							{
								realRefClassMap = refClassMap.DomainMap.MustGetClassMap(value.GetType());
								value = realRefClassMap.TypeValue;
							}
							else
							{
								idPropertyMap = refClassMap.MustGetPropertyMapForColumnMap(forColMap);
								value = om.GetPropertyValue(value, idPropertyMap.Name);
							}
						}
					}
				}
			}
//			if (dataType == DbType.AnsiString || dataType == DbType.AnsiStringFixedLength || dataType == DbType.String || dataType == DbType.StringFixedLength)
//			{
//				if (columnMap.Precision == 0 || columnMap.Precision >= 4000)
//				{
//					compareOp = "LIKE";
//				}
//			}
			param.Value = value;
		}