コード例 #1
0
        /// <summary>
        ///     Maps a DataReader to a TableMetadata implementation.
        /// </summary>
        /// <param name="selectQuery">The ExecutionQuery</param>
        /// <param name="table">TableMetadata on which the query results will be mapped </param>
        /// <returns>ArrayList with TableMetadata results</returns>
        internal ArrayList MapDataReaderToTableMetadata(ExecutionQuery selectQuery, TableMetadata table)
        {
            IDataReader iread    = null;
            ArrayList   alTables = null;

            ExecutionEngine exec = null;

            try
            {
                alTables = new ArrayList();

                //check if we run it in the context session
                if (contextSession != null)
                {
                    iread = execEngine.ExecuteReader(selectQuery);
                }
                else
                {
                    exec  = new ExecutionEngine();
                    iread = exec.ExecuteReader(database, connectionString, selectQuery);
                }

                int columnCount = iread.FieldCount;

                while (iread.Read())
                {
                    //create a instance of the table metadata
                    TableMetadata tempTable = (TableMetadata)Activator.CreateInstance(table.GetType());

                    //set the field's fieldValue
                    for (int i = 0; i < columnCount; i++)
                    {
                        //tempTable.SetFieldValue(tempTable.TableFields[i].fieldName, iread.GetValue(i));
                        tempTable.SetFieldValue(i, iread.GetValue(i));
                    }

                    alTables.Add(tempTable);
                }

                iread.Close();

                return(alTables);
            }
            finally
            {
                if (iread != null && iread.IsClosed == false)
                {
                    iread.Close();
                }

                if (exec != null)
                {
                    exec.Dispose();
                }
            }
        }
コード例 #2
0
ファイル: DataConvertor.cs プロジェクト: mariusmg/DataBlock
        /// <summary>
        ///     Converts data from a DataTable to TableMetadata array. The scheme of the DataTable
        ///     must be the same with that of the TableMetadata.
        /// </summary>
        /// <param name="table">DataTable which contains the data </param>
        /// <param name="metadata">Type of TableMetadata</param>
        /// <returns>TableMetadata array which holds the converted items</returns>
        public Array ConvertToTableMatadata(DataTable table, TableMetadata metadata)
        {
            Array arr = Array.CreateInstance(metadata.GetType(), table.Rows.Count);

            for (int i = 0; i < table.Rows.Count; i++)
            {
                TableMetadata meta = (TableMetadata)Activator.CreateInstance(metadata.GetType());

                for (int j = 0; j < table.Columns.Count; j++)
                {
                    meta.SetFieldValue(table.Columns[j].ColumnName, table.Rows[i][j]);
                }

                arr.SetValue(meta, i);
            }

            return(arr);
        }
コード例 #3
0
        /// <summary>
        ///     Inserts a new object into the database.
        /// </summary>
        /// <param name="metaTable">TableMatadata from which the object is created</param>
        public int Create(TableMetadata metaTable)
        {
            //collection of queries which will be executed
            List <ExecutionQuery> listQueries = null;

            int resultCounter = 0;

            DatabaseField field = metaTable.GetPrimaryKeyField();

            SqlGenerator generator = new SqlGenerator();

            ExecutionEngine exec = null;

            try
            {
                listQueries = new List <ExecutionQuery>();

                //get the attached tabels
                TableMetadata[] attachedData = metaTable.AttachedData;

                //check if the table has attached tables.
                //If not generate the insert only for a single table.
                if (attachedData.Length == 0)
                {
                    //generate the sql command
                    ExecutionQuery insertQuery = generator.GenerateInsertQuery(database, metaTable);

                    //add PK constraint if necessary
                    if (field.isValueAutogenerated)
                    {
                        insertQuery.Query = ConstraintManager.GeneratePrimaryKeyConstraint(field.fieldName, metaTable.TableName, insertQuery.Query);
                    }

                    listQueries.Add(insertQuery);
                }
                else
                {
                    //generate the multiple table's insert.
                    List <ExecutionQuery> multipleQueries = generator.GenerateMultipleInsertQueries(database, metaTable);
                    // containsSpecialModifications = true;

                    //add the queries to the
                    foreach (ExecutionQuery var in multipleQueries)
                    {
                        listQueries.Add(var);
                    }
                }

                //run in the  current session
                if (contextSession != null)
                {
                    //the context is in a transaction so just cache the inserts.
                    if (contextSession.IsInTransaction)
                    {
                        foreach (ExecutionQuery var in listQueries)
                        {
                            contextSession.Queries.Add(var);
                        }
                    }
                    else
                    {
                        resultCounter = execEngine.ExecuteNonQuery(listQueries);
                    }
                }
                else
                {
                    //
                    BeforeExecutingQueries(Operation.Create, ref listQueries);

                    exec = new ExecutionEngine();

                    //check if we need the PK or not
                    if (field.isValueAutogenerated && listQueries.Count == 1)
                    {
                        List <object> listPrimaryKeysValues = new List <object>();

                        resultCounter = exec.ExecuteNonQuery(listQueries, Configuration.DefaultTransactionIsolationLevel, out listPrimaryKeysValues);

                        if (listPrimaryKeysValues.Count > 0)
                        {
                            metaTable.SetFieldValue(field.fieldName, listPrimaryKeysValues[0]);
                        }
                    }
                    else
                    {
                        resultCounter = exec.ExecuteNonQuery(listQueries, Configuration.DefaultTransactionIsolationLevel);
                    }
                }

                return(resultCounter);
            }
            finally
            {
                if (exec != null)
                {
                    exec.Dispose();
                }
            }
        }