/// <summary> /// Get data from a child table based on the relation name and the primary key's fieldValue from the parent table. /// </summary> /// <param name="primaryKeyValue">The fieldValue of the primary key</param> /// <returns>The selected TableMetadata </returns> public TableMetadata GetTableMetadata(object primaryKeyValue) { SqlGenerator generator = new SqlGenerator(); DataFactory factory = new DataFactory(); //generate select statement if (primaryKeyValue == null) { throw new ArgumentException("Invalid fieldValue for primary key"); } ISqlGenerator isql = factory.InitializeSqlGenerator(database); DatabaseField pkField = mappedObject.GetPrimaryKeyField(); pkField.fieldValue = primaryKeyValue; //generate select query ExecutionQuery selectQuery = generator.GenerateSelectQuery(database, mappedObject.TableName, mappedObject.TableFields, pkField); TableMetadata table = (TableMetadata)Activator.CreateInstance(mappedObject.GetType()); ArrayList alList = MapDataReaderToTableMetadata(selectQuery, table); table = (TableMetadata)alList[0]; return(table); }
/// <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> /// 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(); } } }