public static DataTable ReadListTable(Type entityType, string[] fields, Condition[] parameters, string[] orders, int limitNumberOfEntities)
        {
            PersistenceStrategy strategy;
            string tableName, sql, paramPrefix, paramSuffix;

            string[]  filterFields, filterParams;
            object[]  parameterValues;
            DataTable table;

            Operator[] operators;

            strategy        = PersistenceStrategyProvider.FindStrategyFor(entityType);
            tableName       = strategy.GetTableNameOf(entityType);
            filterFields    = StrHelper.GetPropertyValuesOf(parameters, "Field");
            filterParams    = StrHelper.GetNumbers(0, filterFields.Length);
            parameterValues = ArrayHelper.GetPropertyValuesOf(parameters, "Value");
            operators       = ArrayHelper.GetPropertyValuesOf <Operator>(parameters, "Operator");

            paramPrefix  = Transaction.SqlHelper().ParameterPrefix();
            paramSuffix  = Transaction.SqlHelper().ParameterSuffix();
            filterParams = StrHelper.Concat(paramPrefix, filterParams, paramSuffix);

            sql = Transaction.SqlHelper().BuildSelectSqlFor(tableName, fields, filterFields, operators, filterParams, orders, limitNumberOfEntities);

            table = Transaction.Instance.ExecuteSql(sql, parameterValues);

            return(table);
        }
        public static int Update(object entity)
        {
            Type type;
            PersistenceStrategy strategy;
            string tableName, sql, keyField, keyParameter, paramPrefix, paramSuffix,
                   optimisticLockField;

            string[] fieldNames, parameterNames;
            object[] fieldValues;
            object   keyValue;
            byte     optimisticLockValue;
            int      i;

            type     = entity.GetType();
            strategy = PersistenceStrategyProvider.FindStrategyFor(type);

            tableName      = strategy.GetTableNameOf(type);
            fieldNames     = strategy.GetUpdateFieldNamesOf(type);
            parameterNames = StrHelper.GetNumbers(0, fieldNames.Length);

            paramPrefix    = Transaction.SqlHelper().ParameterPrefix();
            paramSuffix    = Transaction.SqlHelper().ParameterSuffix();
            parameterNames = StrHelper.Concat(paramPrefix, parameterNames, paramSuffix);

            keyField     = strategy.GetKeyColumnOf(type);
            keyParameter = paramPrefix + fieldNames.Length;
            keyValue     = strategy.GetKeyValueOf(entity);

            optimisticLockField = strategy.GetOptimisticLockField(type);
            optimisticLockValue = 0;
            if (!string.IsNullOrEmpty(optimisticLockField))
            {
                optimisticLockValue = (byte)strategy.GetOptimisticLockValue(entity);
            }

            fieldValues = strategy.GetFieldValuesOf(entity, fieldNames);
            ArrayHelper.Merge <object>(ref fieldValues, keyValue);

            sql = Transaction.SqlHelper().BuildUpdateSqlFor(tableName, keyField, keyParameter,
                                                            optimisticLockField, optimisticLockValue,
                                                            fieldNames, parameterNames);

            i = Transaction.Instance.ExecuteNonQuery(sql, fieldValues);
            return(i);
        }
        public static object Insert(object entity)
        {
            Type type;
            PersistenceStrategy strategy;
            string tableName, sql, idSql, paramPrefix, paramSuffix;

            string[]         fieldNames, parameterNames;
            object[]         fieldValues;
            int              i;
            IParameterHandle idParam = null;
            IdMethod         idMethod;
            object           idValue = 0;

            //!!! bu kodun -entity içindeki deðerler alýnmadan- önce çalýþmasý lazým.
            IInsertInfo iInfo = entity as IInsertInfo;

            if (iInfo != null && GetValue != null)
            {
                iInfo.InsertUser = (int)(GetValue("Kullanici_Id") ?? 0);
                iInfo.InsertDate = DateTime.Now;
            }

            type        = entity.GetType();
            strategy    = PersistenceStrategyProvider.FindStrategyFor(type);
            paramPrefix = Transaction.SqlHelper().ParameterPrefix();
            paramSuffix = Transaction.SqlHelper().ParameterSuffix();

            tableName      = strategy.GetTableNameOf(type);
            fieldNames     = strategy.GetInsertFieldNamesOf(type);
            parameterNames = StrHelper.GetNumbers(0, fieldNames.Length);
            parameterNames = StrHelper.Concat(paramPrefix, parameterNames, paramSuffix);
            fieldValues    = strategy.GetFieldValuesOf(entity, fieldNames);


            sql = Transaction.SqlHelper().BuildInsertSqlFor(tableName, fieldNames, parameterNames);

            idMethod = strategy.GetIdMethodFor(type);
            switch (idMethod)
            {
            case IdMethod.Identity:
                idValue = 0;
                idParam = Transaction.Instance.NewParameter("NewId", idValue, ParameterDirection.Output);
                sql     = Transaction.SqlHelper().
                          BuildInsertSqlWithIdentity(tableName, fieldNames, parameterNames, "NewId");
                break;

            case IdMethod.BySql:
                idSql   = strategy.GetIdSqlFor(type);
                idValue = Transaction.Instance.ExecuteScalar(idSql);
                break;

            case IdMethod.Custom:
                idValue = strategy.GetIdFor(entity, Transaction.Instance);
                break;

            case IdMethod.UserSubmitted:
                idValue = strategy.GetIdFor(entity, Transaction.Instance);
                ((ActiveRecord.ActiveRecordBase)entity).Id = (long)idValue;
                fieldValues = strategy.GetFieldValuesOf(entity, fieldNames);
                break;
            }

            if (Transaction.SqlHelper().GetType() == typeof(MySqlHelper))
            {
                //MySql için output parametreler ile ilgili sorun var!!!
                idParam.Value = Transaction.Instance.ExecuteScalar(sql, fieldValues);
                i             = 1; //***
            }
            else
            {
                i = Transaction.Instance.ExecuteNonQuery(sql, fieldValues, idParam);
            }

            if (idParam != null)
            {
                idValue = idParam.Value; //this works when 'idMethod' is '..Identity'
            }
            return(idValue);
        }