Beispiel #1
0
        /// <summary>
        ///     Deletes the row by the specified primary key value.
        /// </summary>
        /// <param name="primaryKeyValue">The primary key value.</param>
        /// <returns>Number of affected rows</returns>
        public int Delete(object primaryKeyValue)
        {
            IQueryCriteriaGenerator queryCriteriaGenerator = null;

            DataFactory factory = new DataFactory();

            int affectedRows = 0;

            ExecutionEngine exec = null;

            try
            {
                queryCriteriaGenerator = factory.InitializeQueryCriteriaGenerator(database);

                DatabaseField field = mappedObject.GetPrimaryKeyField();

                field.fieldValue = primaryKeyValue;

                QueryCriteria criteria = new QueryCriteria(mappedObject.TableName);

                criteria.Add(CriteriaOperator.Equality, field, primaryKeyValue);

                ExecutionQuery query = queryCriteriaGenerator.GenerateDelete(criteria);

                if (contextSession != null)
                {
                    if (contextSession.IsInTransaction)
                    {
                        contextSession.Queries.Add(query);
                    }
                    else
                    {
                        affectedRows = execEngine.ExecuteNonQuery(query);
                    }
                }
                else
                {
                    exec = new ExecutionEngine();

                    affectedRows = exec.ExecuteNonQuery(query);
                }

                return(affectedRows);
            }
            finally
            {
                if (exec != null)
                {
                    exec.Dispose();
                }
            }
        }
Beispiel #2
0
        private object RunIntrinsecFunction(CriteriaOperator criteria, DatabaseField field)
        {
            IQueryCriteriaGenerator iql = null;

            object result;

            ExecutionEngine exec = null;

            try
            {
                QueryCriteria qc = new QueryCriteria(mappedObject.TableName, field);
                qc.Add(criteria, field);

                DataFactory factory = new DataFactory();

                iql = factory.InitializeQueryCriteriaGenerator(database);

                ExecutionQuery query = iql.GenerateSelect(qc);

                if (contextSession != null)
                {
                    result = execEngine.ExecuteScalar(query);
                }
                else
                {
                    exec   = new ExecutionEngine();
                    result = exec.ExecuteScalar(database, connectionString, query);
                }

                return(result);
            }
            finally
            {
                if (exec != null)
                {
                    exec.Dispose();
                }
            }
        }
Beispiel #3
0
        /// <summary>
        ///     Gets the data from a related table in a ManyToMany relation.
        /// </summary>
        /// <param name="relatedTableType">Type of the related entity</param>
        /// <param name="intermediaryRelatedTableType">Type of the intermediary table</param>
        /// <returns>TableMetadata array which contains the results</returns>
        protected Array GetRelatedTableData(Type relatedTableType, Type intermediaryRelatedTableType)
        {
            PersistentObject        persistent = null;
            ManyToManyTableRelation relation   = null;
            DataSet ds = null;

            try
            {
                //create a instance of the table so we can check the relations between out table and this
                TableMetadata relatedTable      = (TableMetadata)Activator.CreateInstance(relatedTableType);
                TableMetadata intermediateTable = (TableMetadata)Activator.CreateInstance(intermediaryRelatedTableType);

                object primaryKeyValue = GetPrimaryKeyField().fieldValue;

                //first check the fieldValue of the primary key
                if (GetPrimaryKeyField().fieldValue == null)
                {
                    throw new InvalidOperationException("The primary key does not have a fieldValue");
                }

                //get the relation
                foreach (TableRelation var in Relations)
                {
                    if (var is ManyToManyTableRelation)
                    {
                        if (var.RelatedTableName == relatedTable.TableName)
                        {
                            relation = (ManyToManyTableRelation)var;
                            break;
                        }
                    }
                }

                //check if we got the relation
                if (relation == null)
                {
                    throw new ArgumentException("A relation cannot be found between the tables");
                }

                //we have the relation between the 2 tables.
                persistent = new PersistentObject(this);

                QueryCriteria qcThis = new QueryCriteria(TableName, GetPrimaryKeyField());
                qcThis.Add(CriteriaOperator.Equality, GetPrimaryKeyField(), primaryKeyValue);

                //generate here the inner join
                QueryCriteria qcIntermediaryTable = new QueryCriteria(intermediateTable.TableName, intermediateTable.GetField(relation.IntermediaryKeyFieldFromParentTable));

                QueryCriteria qcChild = new QueryCriteria(relatedTable);

                qcThis.AddJoin(JoinType.Inner, TableName, GetPrimaryKeyField(), intermediateTable.TableName,
                               intermediateTable.GetField(relation.IntermediaryKeyFieldFromParentTable), qcIntermediaryTable);

                qcThis.AddJoin(JoinType.Inner, intermediateTable.TableName, intermediateTable.GetField(relation.IntermediaryKeyFieldFromChildTable), relatedTable.TableName,
                               relatedTable.GetField(relation.IntermediaryKeyFieldFromChildTable), qcChild);

                ds = persistent.GetDataSet(qcThis);

                Array data = Array.CreateInstance(relatedTableType, ds.Tables[0].Rows.Count);

                for (int i = 0; i < data.Length; i++)
                {
                    object instance = Activator.CreateInstance(relatedTableType);
                    data.SetValue(instance, i);

                    //loop thru dataset
                    for (int j = START_INDEX_FIELD; j < ds.Tables[0].Columns.Count; j++)
                    {
                        Type tp = data.GetValue(i).GetType();

                        object[] args = new[] { ds.Tables[0].Columns[j].ColumnName, ds.Tables[0].Rows[i][j] };
                        tp.InvokeMember("SetFieldValue", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, instance, args);
                    }
                }

                return(data);
            }
            catch
            {
                throw;
            }
            finally
            {
                if (ds != null)
                {
                    ds.Dispose();
                }
            }
        }