public static DataTable ToOlapDataTable(IDataReader reader, IDataMap dataMap, DataTableCallback callback) { DataTable schemaTable = reader.GetSchemaTable(); DataTable dataTable = new DataTable(); dataTable.Locale = CultureInfo.InvariantCulture; List <string> columnNames = new List <string>(); List <bool> nullables = new List <bool>(); List <Type> types = new List <Type>(); AddPrimaryKeyColumn(dataTable); for (int i = 0; i < schemaTable.Rows.Count; i++) { DataRow schemaTableRow = schemaTable.Rows[i]; if (!dataTable.Columns.Contains(schemaTableRow["ColumnName"].ToString())) { string columnName = schemaTableRow["ColumnName"].ToString(); IDataMapEntry entry = dataMap.FindOlapColumn(columnName); DataColumn dataColumn = new DataColumn(); dataColumn.ColumnName = entry.FieldName; dataColumn.Unique = Convert.ToBoolean(schemaTableRow["IsUnique"], CultureInfo.InvariantCulture); dataColumn.AllowDBNull = Convert.ToBoolean(schemaTableRow["AllowDBNull"], CultureInfo.InvariantCulture); dataColumn.ReadOnly = Convert.ToBoolean(schemaTableRow["IsReadOnly"], CultureInfo.InvariantCulture); dataColumn.DataType = (entry.TypeName == null) ? (Type)schemaTableRow["DataType"] : Type.GetType(entry.TypeName); dataColumn.ExtendedProperties.Add("DataColumnInfo", DataColumnInfo.FromSchemaRow(schemaTableRow)); columnNames.Add(columnName); types.Add(dataColumn.DataType); nullables.Add(dataColumn.AllowDBNull); dataTable.Columns.Add(dataColumn); } } foreach (DataColumn column in callback.NewColumns) { dataTable.Columns.Add(column); } while (reader.Read()) { DataRow dataRow = dataTable.NewRow(); for (int i = 0; i < columnNames.Count; i++) { string name = dataMap.FindOlapColumn(columnNames[i]).FieldName; object value = reader[columnNames[i]]; dataRow[name] = ConversionHelper.Convert(value, types[i], ConversionHelper.DefaultValue(types[i], nullables[i])); } if (callback.RegisterRow(dataRow)) { dataTable.Rows.Add(dataRow); } } return(dataTable); }
public void AddDataMapEntry(IDataMapEntry entry) { if (entries.Keys.Contains(entry.FieldName)) { throw new ReportException("Field name: " + entry.FieldName + " already exists in ReportDatamap."); } entries.Add(entry.FieldName, entry); }