using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace Ant.ORM
{
    /// <summary>
    /// SQL命令参数类
    /// </summary>
    public sealed class QueryParameter : MarshalByRefObject, IDataParameter, ICloneable
    {
        private DbType m_DbType;
        private ParameterDirection m_Direction;
        private bool m_IsNullable;
        private string m_ParameterName;
        private int m_Size;
        private byte m_precision;
        private byte m_scale;
        private string m_SourceColumn;
        private DataRowVersion m_SourceVersion;
        private object m_Value;


        #region IDataParameter 成员

        public DbType DbType
        {
            get
            {
                return m_DbType;
            }
            set
            {
                m_DbType = value;
            }
        }

        public ParameterDirection Direction
        {
            get
            {
                return m_Direction;
            }
            set
            {
                m_Direction = value;
            }
        }

        public bool IsNullable
        {
            get { return m_IsNullable; }
            set { m_IsNullable = value; }
        }

        public string ParameterName
        {
            get
            {
                return m_ParameterName;
            }
            set
            {
                m_ParameterName = value;
            }
        }

        public byte Precision
        {
            get { return m_precision; }
            set { m_precision = value; }
        }

        public byte Scale
        {
            get { return m_scale; }
            set { m_scale = value; }
        }

        public int Size
        {
            get { return m_Size; }
            set { m_Size = value; }
        }
        public string SourceColumn
        {
            get
            {
                return m_SourceColumn;
            }
            set
            {
                m_SourceColumn = value;
            }
        }

        public DataRowVersion SourceVersion
        {
            get
            {
                return m_SourceVersion;
            }
            set
            {
                m_SourceVersion = value;
            }
        }

        public object Value
        {
            get
            {
                return m_Value;
            }
            set
            {
                m_Value = value;
            }
        }
        public QueryParameter()
        {
            m_Value = null;
            m_Direction = ParameterDirection.Input;
            m_Size = 0;
            m_SourceVersion = DataRowVersion.Current;
        }
        public QueryParameter(string parameterName, object Value)
            : this()
        {
            m_ParameterName = parameterName;
            m_Value = Value;
        }
        public QueryParameter(string parameterName, object Value, DbType dbType) : this(parameterName, Value)
        {

            m_DbType = dbType;
        }
        public QueryParameter(string parameterName, DbType dbType)
            : this()
        {
            m_ParameterName = parameterName;
            m_DbType = dbType;
        }
        public QueryParameter(string parameterName, DbType dbType, int size) : this()
        {
            m_ParameterName = parameterName;
            m_DbType = dbType;
            m_Size = size;
        }
        public QueryParameter(string parameterName, DbType dbType, int size, string sourceColumn)
            : this()
        {
            m_ParameterName = parameterName;
            m_DbType = dbType;
            m_Size = size;
            m_SourceColumn = sourceColumn;
        }
        public QueryParameter(string parameterName, DbType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object Value)
            : this()
        {
            m_ParameterName = parameterName;
            m_DbType = dbType;
            m_Size = size;
            m_Direction = direction;
            m_IsNullable = isNullable;
            m_precision = precision;
            m_scale = scale;
            m_SourceColumn = sourceColumn;
            m_SourceVersion = sourceVersion;
            m_Value = Value;

        }

        public override string ToString()
        {
            return m_ParameterName;
        }

        #endregion

        #region ICloneable 成员

        public object Clone()
        {
            QueryParameter parameter1;
            parameter1 = new QueryParameter(m_ParameterName, m_DbType, m_Size, m_Direction, m_IsNullable, m_precision, m_scale, m_SourceColumn, m_SourceVersion, m_Value);
            return parameter1;
        }

        #endregion
    }
}