public bool TryFindValue(string SqlSelect, out object Value,
                                 params FieldParam[] Parameters)
        {
            bool MustClose;

            if (Dp.Connection.State != ConnectionState.Open)
            {
                Dp.Connection.Open();
                MustClose = true;
            }
            else
            {
                MustClose = false;
            }

            try
            {
                IDbCommand Cmd = Dp.CreateCommand(
                    SqlSelect, CommandType.Text, Parameters);

                Dp.WriteLog(SqlSelect);

                object TmpValue = _ExecuteScalar(Cmd);
                if (TmpValue == DBNull.Value || TmpValue == null)
                {
                    Value = null;
                }
                else
                {
                    Type tp = TmpValue.GetType();
                    if (tp == typeof(Single) ||
                        tp == typeof(double))
                    {
                        Value = TmpValue == typeof(decimal);
                    }
                    else
                    {
                        Value = TmpValue;
                    }
                }
                return(Value != null);
            }
            finally
            {
                if (MustClose)
                {
                    Dp.Connection.Close();
                }
            }
        }
        private void TransferTable(TableDef td, string Condition)
        {
            string strWhere = Condition.Length > 0 ?
                " WHERE " + Condition : string.Empty;

            DpDestination.ValidateTableDef(td);

            FieldParam[] ListParam = new FieldParam[
                td.KeyFields.Count + td.NonKeyFields.Count];
            int paramCtr = 0;
            StringBuilder strFieldsDest = new StringBuilder();
            StringBuilder strFieldsSource = new StringBuilder();
            foreach (FieldDef fld in td.KeyFields.Values) 
            {
                strFieldsDest.Append(",").Append(fld._FieldName);
                strFieldsSource.Append(",").Append(fld._FieldName);
                ListParam[paramCtr++] = new FieldParam(fld);
            }
            foreach(FieldDef fld in td.NonKeyFields.Values) 
            {
                strFieldsDest.Append(",").Append(fld._FieldName);
                strFieldsSource.Append(",").Append(fld._FieldName);
                ListParam[paramCtr++] = new FieldParam(fld);
            }

            string strTemp = strFieldsDest.Remove(0, 1).ToString();
            string strInsert = string.Concat("INSERT INTO ", 
                td._TableName, "(", 
                strTemp, ") VALUES (", 
                strTemp.Replace(",", ",@").Insert(0, "@"), ")");

            strTemp = strFieldsSource.Remove(0, 1).ToString();
            DataTable dt = DpSource.OpenDataTable(string.Concat(
                "SELECT ", strTemp, " FROM ", td._TableName, strWhere));

            int j = dt.Columns.Count;
            IDbCommand Cmd = DpDestination.CreateCommand(strInsert,
                CommandType.Text, ListParam);
            foreach (DataRow dr in dt.Rows)
            {
                for (int i = 0; i < j; i++)
                    Cmd.Parameters[i] = dr[i];
                Cmd.ExecuteNonQuery();
            }
        }
        // Real Find
        public bool TryFindFirstValues <TEntity>(string FieldNames,
                                                 string Conditions, string OrderFields, out object[] Values,
                                                 params FieldParam[] Parameters)
            where TEntity : BaseEntity
        {
            TableDef        td = MetaData.GetTableDef(typeof(TEntity));
            DataPersistance Dp = td.GetDataPersistance(this.Dp);

            Dp.ValidateTableDef(td);
            string[] FName     = FieldNames.Split(',');
            string   SqlSelect = string.Empty;

            bool IsLSQLExist = false;

            for (int i = 0; i < FName.Length; i++)
            {
                FieldDef fld = td.GetFieldDef(FName[i]);
                if (fld != null)
                {
                    if (fld._dtlsa == null)
                    {
                        SqlSelect = string.Concat(SqlSelect, ",",
                                                  fld._FieldName);
                    }
                    else
                    {
                        SqlSelect = string.Concat(SqlSelect, ",(",
                                                  fld._dtlsa.GetSqlQuery(), ") AS ",
                                                  fld._FieldName);
                        IsLSQLExist = true;
                    }
                }
                else
                {
                    SqlSelect = string.Concat(SqlSelect, ",", FName[i].Trim());
                }
            }
            SqlSelect = string.Concat("SELECT ", SqlSelect.Remove(0, 1),
                                      " FROM ", td.GetSqlHeaderView(Dp));
            if (IsLSQLExist)
            {
                SqlSelect = string.Concat("SELECT * FROM (", SqlSelect, ") AS ", td._TableName);
            }
            if (Conditions.Length > 0)
            {
                SqlSelect = string.Concat(SqlSelect, " WHERE ", Conditions);
            }
            IDbCommand Cmd = Dp.CreateCommand(
                Dp.GetSqlSelectTopN(SqlSelect, 1, OrderFields),
                CommandType.Text, Parameters);

            bool MustClose;

            if (Dp.Connection.State != ConnectionState.Open)
            {
                Dp.Connection.Open();
                MustClose = true;
            }
            else
            {
                MustClose = false;
            }

            IDataReader rdr = null;

            try
            {
                Dp.WriteLog(Cmd.CommandText);
                rdr = Dp._ExecuteReader(Cmd);
                if (rdr.Read())
                {
                    Values = new object[rdr.FieldCount];
                    for (int i = 0; i < rdr.FieldCount; i++)
                    {
                        Values[i] = NormalizeVarType(rdr[i]);
                    }
                    return(true);
                }
                Values = null;
                return(false);
            }
            finally
            {
                if (rdr != null)
                {
                    rdr.Close();
                }
                if (MustClose)
                {
                    Dp.Connection.Close();
                }
            }
        }
        public bool IsExists(Type EntityType, string Conditions,
                             params FieldParam[] Parameters)
        {
            TableDef        td = MetaData.GetTableDef(EntityType);
            DataPersistance Dp = td.GetDataPersistance(this.Dp);

            Dp.ValidateTableDef(td);

            string FieldName = string.Empty;

            foreach (FieldDef fd in td.KeyFields.Values)
            {
                FieldName = fd._FieldName;
                break;
            }

            string SqlSelectBld = string.Empty;

            foreach (FieldDef fd in td.NonKeyFields.Values)
            {
                if (fd._dtlsa == null)
                {
                    if (FieldName.Length == 0)
                    {
                        FieldName = fd._FieldName;
                    }
                }
                else
                {
                    SqlSelectBld = string.Concat(SqlSelectBld, ",(",
                                                 fd._dtlsa.GetSqlQuery(), ") AS ", fd._FieldName);
                }
            }

            string SqlSelect = SqlSelectBld.Length == 0 ? string.Concat("SELECT ",
                                                                        FieldName, " FROM ", td.GetSqlHeaderView(Dp)) : string.Concat(
                "SELECT ", FieldName, " FROM (SELECT *", SqlSelectBld, " FROM ",
                td.GetSqlHeaderView(Dp), ") AS ", td._TableName);

            if (Conditions.Length > 0)
            {
                SqlSelect = string.Concat(SqlSelect, " WHERE ", Conditions);
            }
            SqlSelect = Dp.GetSqlSelectTopN(SqlSelect, 1, string.Empty);
            IDbCommand Cmd = Dp.CreateCommand(SqlSelect, CommandType.Text,
                                              Parameters);

            bool MustClose;

            if (Dp.Connection.State != ConnectionState.Open)
            {
                Dp.Connection.Open();
                MustClose = true;
            }
            else
            {
                MustClose = false;
            }

            IDataReader rdr = null;

            try
            {
                Dp.WriteLog(Cmd.CommandText);
                rdr = Dp._ExecuteReader(Cmd);
                return(rdr.Read());
            }
            finally
            {
                if (rdr != null)
                {
                    rdr.Close();
                }
                if (MustClose)
                {
                    Dp.Connection.Close();
                }
            }
        }