public static T[] ReadList <T>(string sql, params object[] parameterValues)
        {
            Type type;

            T[] entities;
            PersistenceStrategy strategy;
            DataTable           table;

            type     = typeof(T);
            strategy = PersistenceStrategyProvider.FindStrategyFor(type);
            if (string.IsNullOrEmpty(sql))
            {
                sql = string.Format("select * from {0}", strategy.GetTableNameOf(type));
            }

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

            if (table.Rows.Count > 0)
            {
                entities = new T[table.Rows.Count];
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    entities[i] = Activator.CreateInstance <T>();
                    strategy.Fill(entities[i], table.Rows[i]);
                }
            }
            else
            {
                entities = new T[0];
            }

            return(entities);
        }
        public static T[] ReadList <T>(string[] fields, Condition[] parameters, string[] orders, int limitNumberOfEntities)
        {
            Type type;

            T[] entities;
            PersistenceStrategy strategy;
            DataTable           table;

            type     = typeof(T);
            strategy = PersistenceStrategyProvider.FindStrategyFor(type);
            table    = ReadListTable(type, fields, parameters, orders, limitNumberOfEntities);

            if (table.Rows.Count > 0)
            {
                entities = new T[table.Rows.Count];
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    entities[i] = Activator.CreateInstance <T>();
                    strategy.Fill(entities[i], table.Rows[i]);
                }
            }
            else
            {
                entities = new T[0];
            }

            return(entities);
        }
        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 void DeleteByKey(Type entityType, object key, bool throwException)
        {
            PersistenceStrategy strategy;
            string           tableName, keyField, sql, keyParamName, keyParamSql;
            IParameterHandle idParameter;
            int numberOfRows;

            strategy  = PersistenceStrategyProvider.FindStrategyFor(entityType);
            tableName = strategy.GetTableNameOf(entityType);
            keyField  = strategy.GetKeyColumnOf(entityType);

            keyParamName = "prmId";
            keyParamSql  = Transaction.SqlHelper().GenerateParamName(keyParamName);

            sql         = Transaction.SqlHelper().BuildDeleteSqlFor(tableName, keyField, keyParamSql);
            idParameter = Transaction.Instance.NewParameter(keyParamName, key, ParameterDirection.Input);

            numberOfRows = Transaction.Instance.ExecuteNonQuery(sql, ArrayHelper.EmptyArray, idParameter);
        }
        public static object Read(object entity, object primaryKey)
        {
            Type                type = entity.GetType();
            DataTable           table;
            PersistenceStrategy strategy;
            string              tableName, keyColumn, keyParamName, sql;

            string[] fieldNames;

            strategy  = PersistenceStrategyProvider.FindStrategyFor(type);
            tableName = strategy.GetTableNameOf(type);
            keyColumn = strategy.GetKeyColumnOf(type);

            sql = strategy.GetSelectStatementFor(type, new string[] { keyColumn }, new string[] { "@prm0" });

            //For types which are not views, sql is null or empty.
            if (string.IsNullOrEmpty(sql))
            {
                keyParamName = Transaction.SqlHelper().GenerateParamName(0);
                fieldNames   = strategy.GetSelectFieldNamesOf(type);

                sql = Transaction.SqlHelper().BuildSelectSqlFor(tableName, fieldNames,
                                                                new string[] { keyColumn },
                                                                new string[] { keyParamName }, null, 0);
            }

            table = Transaction.Instance.ExecuteSql(sql, primaryKey);
            if (table.Rows.Count > 0)
            {
                strategy.Fill(entity, table.Rows[0]);
            }
            else
            {
                entity = null;
            }

            return(entity);
        }
        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);
        }