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