示例#1
0
        public IList <TObject> SelectObjects <TObject>(string whereExpression, Transaction.IsolationLevel isolation)
            where TObject : DataObject
        {
            var dataObjects = SelectObjectsImpl <TObject>(whereExpression, isolation);

            return(dataObjects ?? new List <TObject>());
        }
示例#2
0
        public IList <TObject> SelectAllObjects <TObject>(Transaction.IsolationLevel isolation)
            where TObject : DataObject
        {
            var dataObjects = SelectAllObjectsImpl <TObject>(isolation);

            return(dataObjects ?? new List <TObject>());
        }
示例#3
0
        /// <summary>
        /// Selects a single object, if more than
        /// one exist, the first is returned
        /// </summary>
        /// <typeparam name="TObject"></typeparam>
        /// <param name="whereExpression"></param>
        /// <param name="isolation"></param>
        /// <returns></returns>
        public TObject SelectObject <TObject>(string whereExpression, Transaction.IsolationLevel isolation)
            where TObject : DataObject
        {
            var objs = SelectObjects <TObject>(whereExpression, isolation);

            if (objs.Count > 0)
            {
                return(objs[0]);
            }

            return(null);
        }
示例#4
0
        /// <summary>
        /// Selects all objects from a given table in the database.
        /// This is SLOW SLOW SLOW.  You should cache these results rather than reading from the XML file each time.
        /// </summary>
        /// <param name="objectType">the type of objects to retrieve</param>
        /// <returns>an array of <see cref="DataObject" /> instances representing the selected objects</returns>
        protected override IList <TObject> SelectAllObjectsImpl <TObject>(Transaction.IsolationLevel isolation)
        {
            string tableName = DataObject.GetTableName(typeof(TObject));

            if (Log.IsDebugEnabled)
            {
                Log.Debug("1. select all " + tableName);
            }

            DataSet ds = GetDataSet(tableName);

            if (ds != null)
            {
                Connection.LoadDataSet(tableName, ds);
                DataTable table = ds.Tables[tableName];
                DataRow[] rows  = table.Select();

                int count = rows.Length;
                //Create an array of our destination objects
                var objs = new List <TObject>(count);

                for (int i = 0; i < count; i++)
                {
                    var remap = (TObject)(Activator.CreateInstance(typeof(TObject)));
                    FillObjectWithRow(ref remap, rows[i], false);

                    objs.Add(remap);
                }

                if (Log.IsDebugEnabled)
                {
                    Log.Debug("2. select all " + tableName);
                }

                return(objs);
            }

            return(new List <TObject>());
        }
示例#5
0
 /// <summary>
 /// Selects objects from a given table in the database based on a given set of criteria. (where clause)
 /// </summary>
 /// <param name="objectType"></param>
 /// <param name="whereClause"></param>
 /// <param name="isolation"></param>
 /// <returns></returns>
 protected abstract DataObject[] SelectObjectsImpl(Type objectType, string whereClause, Transaction.IsolationLevel isolation);
示例#6
0
        /// <summary>
        /// Selects objects from a given table in the database based on a given set of criteria. (where clause)
        /// This is SLOW SLOW SLOW.  You should cache these results rather than reading from the XML file each time.
        /// </summary>
        /// <param name="objectType">the type of objects to retrieve</param>
        /// <param name="whereClause">the where clause to filter object selection on</param>
        /// <returns>an array of <see cref="DataObject" /> instances representing the selected objects that matched the given criteria</returns>
        protected override IList <TObject> SelectObjectsImpl <TObject>(string statement, Transaction.IsolationLevel isolation)
        {
            string tableName = GetTableOrViewName(typeof(TObject));

            if (Log.IsDebugEnabled)
            {
                Log.Debug("1. select objects " + tableName + " " + statement);
            }

            DataSet ds = GetDataSet(tableName);

            if (ds != null)
            {
                Connection.LoadDataSet(tableName, ds);
                DataTable table = ds.Tables[tableName];

                if (Log.IsDebugEnabled)
                {
                    Log.Debug("2. " + tableName + " " + statement);
                }

                DataRow[] rows = table.Select(statement);

                if (Log.IsDebugEnabled)
                {
                    Log.Debug("3. " + tableName + " " + statement);
                }

                int count = rows.Length;

                var objs = new List <TObject>(count);
                for (int i = 0; i < count; i++)
                {
                    var remap = (TObject)(Activator.CreateInstance(typeof(TObject)));
                    FillObjectWithRow(ref remap, rows[i], false);

                    objs.Add(remap);
                }

                if (Log.IsDebugEnabled)
                {
                    Log.Debug("4. select objects " + tableName + " " + statement);
                }

                return(objs);
            }

            return(new List <TObject>());
        }
示例#7
0
 /// <summary>
 /// Raw SQL Select Implementation with Parameters for Single Prepared Query
 /// </summary>
 /// <param name="SQLCommand">Command for reading</param>
 /// <param name="parameter">Collection of Parameters for Single Read</param>
 /// <param name="Reader">Reader Method</param>
 /// <param name="Isolation">Transaction Isolation</param>
 protected void ExecuteSelectImpl(string SQLCommand, IEnumerable <QueryParameter> parameter, Action <IDataReader> Reader, Transaction.IsolationLevel Isolation)
 {
     ExecuteSelectImpl(SQLCommand, new [] { parameter }, Reader, Isolation);
 }
示例#8
0
        /// <summary>
        /// Retrieve a Collection of DataObjects Sets from database filtered by Parametrized Where Expression
        /// </summary>
        /// <param name="tableHandler">Table Handler for these DataObjects</param>
        /// <param name="whereExpression">Parametrized Where Expression</param>
        /// <param name="parameters">Parameters for filtering</param>
        /// <param name="isolation">Isolation Level</param>
        /// <returns>Collection of DataObjects Sets matching Parametrized Where Expression</returns>
        protected override IList <IList <DataObject> > SelectObjectsImpl(DataTableHandler tableHandler, string whereExpression, IEnumerable <IEnumerable <QueryParameter> > parameters, Transaction.IsolationLevel isolation)
        {
            var columns = tableHandler.FieldElementBindings.ToArray();

            string command = null;

            if (!string.IsNullOrEmpty(whereExpression))
            {
                command = string.Format("SELECT {0} FROM `{1}` WHERE {2}",
                                        string.Join(", ", columns.Select(col => string.Format("`{0}`", col.ColumnName))),
                                        tableHandler.TableName,
                                        whereExpression);
            }
            else
            {
                command = string.Format("SELECT {0} FROM `{1}`",
                                        string.Join(", ", columns.Select(col => string.Format("`{0}`", col.ColumnName))),
                                        tableHandler.TableName);
            }

            var primary     = columns.FirstOrDefault(col => col.PrimaryKey != null);
            var dataObjects = new List <IList <DataObject> >();

            ExecuteSelectImpl(command, parameters, reader => {
                var list = new List <DataObject>();

                var data = new object[reader.FieldCount];
                while (reader.Read())
                {
                    reader.GetValues(data);
                    var obj = Activator.CreateInstance(tableHandler.ObjectType) as DataObject;

                    // Fill Object
                    var current = 0;
                    foreach (var column in columns)
                    {
                        DatabaseSetValue(obj, column, data[current]);
                        current++;
                    }

                    // Set Primary Key
                    if (primary != null)
                    {
                        obj.ObjectId = primary.GetValue(obj).ToString();
                    }

                    list.Add(obj);
                    obj.Dirty       = false;
                    obj.IsPersisted = true;
                }
                dataObjects.Add(list.ToArray());
            }, isolation);

            return(dataObjects.ToArray());
        }
示例#9
0
 protected void ExecuteSelectImpl(string SQLCommand, Action <IDataReader> Reader, Transaction.IsolationLevel Isolation)
 => ExecuteSelectImpl(SQLCommand, new [] { Array.Empty <QueryParameter>() }, Reader);
示例#10
0
        /// <summary>
        /// Retrieve a Collection of DataObjects Sets from database filtered by Parametrized Where Expression
        /// </summary>
        /// <param name="tableHandler">Table Handler for these DataObjects</param>
        /// <param name="whereExpression">Parametrized Where Expression</param>
        /// <param name="parameters">Parameters for filtering</param>
        /// <param name="isolation">Isolation Level</param>
        /// <returns>Collection of DataObjects Sets matching Parametrized Where Expression</returns>
        protected override IList <IList <DataObject> > SelectObjectsImpl(DataTableHandler tableHandler, string whereExpression, IEnumerable <IEnumerable <QueryParameter> > parameters, Transaction.IsolationLevel isolation)
        {
            var columns = tableHandler.FieldElementBindings.ToArray();

            string command = null;

            if (!string.IsNullOrEmpty(whereExpression))
            {
                command = string.Format("SELECT {0} FROM `{1}` WHERE {2}",
                                        string.Join(", ", columns.Select(col => string.Format("`{0}`", col.ColumnName))),
                                        tableHandler.TableName,
                                        whereExpression);
            }
            else
            {
                command = string.Format("SELECT {0} FROM `{1}`",
                                        string.Join(", ", columns.Select(col => string.Format("`{0}`", col.ColumnName))),
                                        tableHandler.TableName);
            }

            var primary     = columns.FirstOrDefault(col => col.PrimaryKey != null);
            var dataObjects = new List <IList <DataObject> >();

            ExecuteSelectImpl(command, parameters, reader => FillQueryResultList(reader, tableHandler, columns, primary, dataObjects));

            return(dataObjects.ToArray());
        }
示例#11
0
 public IList <TObject> SelectAllObjects <TObject>(Transaction.IsolationLevel isolation)
     where TObject : DataObject
 {
     return(SelectAllObjects <TObject>());
 }
示例#12
0
 public IList <TObject> SelectObjects <TObject>(string whereExpression, Transaction.IsolationLevel isolation)
     where TObject : DataObject
 {
     return(SelectObjects <TObject>(whereExpression, new [] { new QueryParameter[] { } }).First().ToArray());
 }
示例#13
0
 public TObject SelectObject <TObject>(string whereExpression, Transaction.IsolationLevel isolation)
     where TObject : DataObject
 {
     return(SelectObjects <TObject>(whereExpression, isolation).FirstOrDefault());
 }
示例#14
0
 /// <summary>
 /// Retrieve a Collection of DataObjects Sets from database filtered by Parametrized Where Expression
 /// </summary>
 /// <param name="tableHandler">Table Handler for these DataObjects</param>
 /// <param name="whereExpression">Parametrized Where Expression</param>
 /// <param name="parameters">Parameters for filtering</param>
 /// <param name="isolation">Isolation Level</param>
 /// <returns>Collection of DataObjects Sets matching Parametrized Where Expression</returns>
 protected abstract IList <IList <DataObject> > SelectObjectsImpl(DataTableHandler tableHandler, string whereExpression, IEnumerable <IEnumerable <QueryParameter> > parameters, Transaction.IsolationLevel isolation);
示例#15
0
 /// <summary>
 /// Selects objects from a given table in the database based on a given set of criteria. (where clause)
 /// </summary>
 /// <typeparam name="TObject">the type of objects to retrieve</typeparam>
 /// <param name="whereClause">the where clause to filter object selection on</param>
 /// <returns>an array of <see cref="DataObject" /> instances representing the selected objects that matched the given criteria</returns>
 /// <returns></returns>
 protected abstract IList <TObject> SelectObjectsImpl <TObject>(string whereClause, Transaction.IsolationLevel isolation)
     where TObject : DataObject;
示例#16
0
 protected void ExecuteSelectImpl(string SQLCommand, QueryParameter param, Action <IDataReader> Reader, Transaction.IsolationLevel Isolation)
 => ExecuteSelectImpl(SQLCommand, new [] { new [] { param } }, Reader);
示例#17
0
 /// <summary>
 /// Selects all objects from a given table in the database.
 /// </summary>
 /// <typeparam name="TObject">the type of objects to retrieve</typeparam>
 /// <returns>an array of <see cref="DataObject" /> instances representing the selected objects</returns>
 /// <returns></returns>
 protected abstract IList <TObject> SelectAllObjectsImpl <TObject>(Transaction.IsolationLevel isolation)
     where TObject : DataObject;
示例#18
0
        /// <summary>
        /// Selects objects from a given table in the database based on a given set of criteria. (where clause)
        /// </summary>
        /// <param name="objectType">the type of objects to retrieve</param>
        /// <param name="whereClause">the where clause to filter object selection on</param>
        /// <returns>an array of <see cref="DataObject" /> instances representing the selected objects that matched the given criteria</returns>
        protected override IList <TObject> SelectObjectsImpl <TObject>(string whereClause, Transaction.IsolationLevel isolation)
        {
            string tableName   = GetTableOrViewName(typeof(TObject));
            var    dataObjects = new List <TObject>(64);

            // build sql command
            var  sb    = new StringBuilder("");
            bool first = true;

            bool usePrimaryKey = false;

            BindingInfo[] bindingInfo = GetBindingInfo(typeof(TObject));
            for (int i = 0; i < bindingInfo.Length; i++)
            {
                if (!bindingInfo[i].HasRelation)
                {
                    if (!first)
                    {
                        sb.Append(", ");
                    }
                    else
                    {
                        first = false;
                    }
                    sb.Append("`" + bindingInfo[i].Member.Name + "`");

                    if (bindingInfo[i].UsePrimaryKey)
                    {
                        usePrimaryKey = true;
                    }
                }
            }

            if (usePrimaryKey)
            {
                sb.Insert(0, "SELECT ");
            }
            else
            {
                sb.Insert(0, "SELECT `" + tableName + "_ID`, ");
            }

            sb.Append(" FROM `" + tableName + "`");

            if (whereClause != null && whereClause.Trim().Length > 0)
            {
                sb.Append(" WHERE " + whereClause);
            }

            string sql = sb.ToString();

            if (Log.IsDebugEnabled)
            {
                Log.Debug("IList<TObject> SelectObjectsImpl: " + sql);
            }

            // read data and fill objects
            Connection.ExecuteSelect(sql, delegate(IDataReader reader)
            {
                var data = new object[reader.FieldCount];
                while (reader.Read())
                {
                    reader.GetValues(data);
                    var obj   = Activator.CreateInstance(typeof(TObject)) as TObject;
                    int field = 0;

                    if (usePrimaryKey == false)
                    {
                        // fill the silly TableName_ID field
                        obj.ObjectId = (string)data[0];
                        field        = 1;
                    }

                    bool hasRelations = false;
                    // we can use hard index access because we iterate the same order here
                    for (int i = 0; i < bindingInfo.Length; i++)
                    {
                        BindingInfo bind = bindingInfo[i];
                        if (!hasRelations)
                        {
                            hasRelations = bind.HasRelation;
                        }

                        if (!bind.HasRelation)
                        {
                            object val = data[field++];
                            if (val != null && !val.GetType().IsInstanceOfType(DBNull.Value))
                            {
                                if (bind.Member is PropertyInfo)
                                {
                                    Type type = ((PropertyInfo)bind.Member).PropertyType;

                                    try
                                    {
                                        if (type == typeof(bool))
                                        {
                                            // special handling for bool
                                            ((PropertyInfo)bind.Member).SetValue(obj,
                                                                                 (val.ToString() == "0") ? false : true,
                                                                                 null);
                                        }
                                        else if (type == typeof(DateTime))
                                        {
                                            // special handling for datetime
                                            if (val is MySqlDateTime)
                                            {
                                                ((PropertyInfo)bind.Member).SetValue(obj,
                                                                                     ((MySqlDateTime)val).GetDateTime(),
                                                                                     null);
                                            }
                                            else
                                            {
                                                ((PropertyInfo)bind.Member).SetValue(obj,
                                                                                     ((IConvertible)val).ToDateTime(null),
                                                                                     null);
                                            }
                                        }
                                        else
                                        {
                                            ((PropertyInfo)bind.Member).SetValue(obj, val, null);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        if (Log.IsErrorEnabled)
                                        {
                                            Log.Error(
                                                tableName + ": " + bind.Member.Name + " = " + val.GetType().FullName +
                                                " doesnt fit to " + bind.Member.DeclaringType.FullName, e);
                                        }
                                        continue;
                                    }
                                }
                                else if (bind.Member is FieldInfo)
                                {
                                    ((FieldInfo)bind.Member).SetValue(obj, val);
                                }
                            }
                        }
                    }

                    dataObjects.Add(obj);
                    obj.Dirty = false;

                    if (hasRelations)
                    {
                        FillLazyObjectRelations(obj, true);
                    }

                    obj.IsPersisted = true;
                }
            }
                                     , isolation);

            return(dataObjects.ToArray());
        }
示例#19
0
 /// <summary>
 /// Raw SQL Select Implementation
 /// </summary>
 /// <param name="SQLCommand">Command for reading</param>
 /// <param name="Reader">Reader Method</param>
 /// <param name="Isolation">Transaction Isolation</param>
 protected void ExecuteSelectImpl(string SQLCommand, Action <IDataReader> Reader, Transaction.IsolationLevel Isolation)
 {
     ExecuteSelectImpl(SQLCommand, new [] { new QueryParameter[] { } }, Reader, Isolation);
 }
示例#20
0
 /// <summary>
 /// Selects all objects from a given table in the database.
 /// </summary>
 /// <param name="objectType">the type of objects to retrieve</param>
 /// <returns>an array of <see cref="DataObject" /> instances representing the selected objects</returns>
 protected override IList <TObject> SelectAllObjectsImpl <TObject>(Transaction.IsolationLevel isolation)
 {
     return(SelectObjectsImpl <TObject>("", isolation));
 }
示例#21
0
 /// <summary>
 /// Raw SQL Select Implementation with Parameters for Prepared Query
 /// </summary>
 /// <param name="SQLCommand">Command for reading</param>
 /// <param name="parameters">Collection of Parameters for Single/Multiple Read</param>
 /// <param name="Reader">Reader Method</param>
 /// <param name="Isolation">Transaction Isolation</param>
 protected abstract void ExecuteSelectImpl(string SQLCommand, IEnumerable <IEnumerable <QueryParameter> > parameters, Action <IDataReader> Reader, Transaction.IsolationLevel Isolation);
示例#22
0
        /// <summary>
        /// Execute select on sql database
        /// Close returned datareader when done or use using(reader) { ... }
        /// </summary>
        /// <param name="sqlcommand"></param>
        /// <param name="callback"></param>
        public void ExecuteSelect(string sqlcommand, QueryCallback callback, Transaction.IsolationLevel isolation)
        {
            if (connType == ConnectionType.DATABASE_MYSQL)
            {
                if (log.IsDebugEnabled)
                {
                    log.Debug("SQL: " + sqlcommand);
                }

                bool repeat = false;
                do
                {
                    repeat = false;

                    using (var conn = new MySqlConnection(connString))
                    {
                        using (var cmd = conn.CreateCommand())
                        {
                            try
                            {
                                cmd.CommandText = sqlcommand;
                                conn.Open();
                                long start = (DateTime.UtcNow.Ticks / 10000);
                                using (var reader = cmd.ExecuteReader())
                                {
                                    try
                                    {
                                        callback(reader);
                                    }
                                    catch (Exception es)
                                    {
                                        if (log.IsWarnEnabled)
                                        {
                                            log.Warn("Exception in Select Callback : ", es);
                                        }
                                    }
                                }

                                if (log.IsDebugEnabled)
                                {
                                    log.Debug("SQL Select (" + isolation + ") exec time " + ((DateTime.UtcNow.Ticks / 10000) - start) + "ms");
                                }
                                else if ((DateTime.UtcNow.Ticks / 10000) - start > 500 && log.IsWarnEnabled)
                                {
                                    log.Warn("SQL Select (" + isolation + ") took " + ((DateTime.UtcNow.Ticks / 10000) - start) + "ms!\n" + sqlcommand);
                                }
                            }
                            catch (Exception e)
                            {
                                if (!HandleException(e))
                                {
                                    if (log.IsErrorEnabled)
                                    {
                                        log.Error("ExecuteSelect: \"" + sqlcommand + "\"\n", e);
                                    }
                                    throw;
                                }

                                repeat = true;
                            }
                        }
                    }
                }while (repeat);

                return;
            }
            else if (connType == ConnectionType.DATABASE_SQLITE)
            {
                if (log.IsDebugEnabled)
                {
                    log.Debug("SQL: " + sqlcommand);
                }

                bool repeat = false;
                do
                {
                    repeat = false;

                    using (var conn = new SQLiteConnection(connString))
                    {
                        using (var cmd = new SQLiteCommand(sqlcommand, conn))
                        {
                            try
                            {
                                conn.Open();

                                long start = (DateTime.UtcNow.Ticks / 10000);
                                using (var reader = cmd.ExecuteReader())
                                {
                                    try
                                    {
                                        callback(reader);
                                    }
                                    catch (Exception es)
                                    {
                                        if (log.IsWarnEnabled)
                                        {
                                            log.Warn("Exception in Select Callback : ", es);
                                        }
                                    }
                                    finally
                                    {
                                        reader.Close();
                                    }
                                }

                                if (log.IsDebugEnabled)
                                {
                                    log.Debug("SQL Select (" + isolation + ") exec time " + ((DateTime.UtcNow.Ticks / 10000) - start) + "ms");
                                }
                                else if ((DateTime.UtcNow.Ticks / 10000) - start > 500 && log.IsWarnEnabled)
                                {
                                    log.Warn("SQL Select (" + isolation + ") took " + ((DateTime.UtcNow.Ticks / 10000) - start) + "ms!\n" + sqlcommand);
                                }
                            }
                            catch (Exception e)
                            {
                                if (!HandleException(e))
                                {
                                    if (log.IsErrorEnabled)
                                    {
                                        log.Error("ExecuteSelect: \"" + sqlcommand + "\"\n", e);
                                    }
                                    throw;
                                }

                                repeat = true;
                            }
                            finally
                            {
                                conn.Close();
                            }
                        }
                    }
                }while (repeat);

                return;
            }

            if (log.IsWarnEnabled)
            {
                log.Warn("SQL Selects not supported for this connection type");
            }
        }