/// <summary> /// Copies the changes from the DataTable to the BaseTable. /// </summary> public static void RetrieveChanges<T>(this BaseTable<T> baseTable, DataTable dataTable) { // delete rows from the target table DataRow[] deletedRows = dataTable.Select("", "", DataViewRowState.Deleted); foreach (var row in deletedRows) { var key = (int) row[baseTable.PrimaryKey]; baseTable.Items.Remove(key); row.AcceptChanges(); } // change rows in the target table var props = TypeDescriptor.GetProperties(typeof(T)); DataRow[] modifiedRows = dataTable.Select("", "", DataViewRowState.ModifiedCurrent); foreach (var row in modifiedRows) { var item = CreateItem<T>(row, props); var origKey = (int) row[baseTable.PrimaryKey, DataRowVersion.Original]; var curKey = (int) row[baseTable.PrimaryKey, DataRowVersion.Current]; if (origKey != curKey) baseTable.Items.Remove(origKey); baseTable.AddItem(item); row.AcceptChanges(); } // add rows to the target table DataRow[] addedRows = dataTable.Select("", "", DataViewRowState.Added); foreach (var row in addedRows) { var item = CreateItem<T>(row, props); baseTable.AddItem(item); row.AcceptChanges(); } }
/// <summary> /// Заполнить таблицу baseTable из файла или потока /// </summary> public void Fill <T>(BaseTable <T> baseTable, bool allowNulls) { if (baseTable == null) { throw new ArgumentNullException("baseTable"); } Stream stream = null; BinaryReader reader = null; baseTable.Items.Clear(); PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); try { stream = ioStream ?? new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); reader = new BinaryReader(stream); FieldDef[] fieldDefs = ReadFieldDefs(stream, reader, out int recSize); if (fieldDefs.Length > 0) { // считывание строк byte[] rowBuf = new byte[recSize]; while (stream.Position < stream.Length) { // загрузка данных строки таблицы в буфер для увеличения скорости работы int readSize = reader.Read(rowBuf, 0, recSize); // заполение строки таблицы из буфера if (readSize == recSize) { T item = Activator.CreateInstance <T>(); int bufInd = 2; foreach (FieldDef fieldDef in fieldDefs) { bool isNull = fieldDef.AllowNull ? rowBuf[bufInd++] > 0 : false; PropertyDescriptor prop = props[fieldDef.Name]; if (prop != null) { object val = allowNulls && isNull ? null : BytesToObj(rowBuf, bufInd, fieldDef.DataType); prop.SetValue(item, val); } bufInd += fieldDef.DataSize; } baseTable.AddItem(item); } } } } catch (EndOfStreamException) { // нормальная ситуация окончания файла } finally { if (fileMode) { reader?.Close(); stream?.Close(); } } }
/// <summary> /// Fill the baseTable table from a file or stream /// </summary> public void Fill <T>(BaseTable <T> baseTable, bool allowNulls) { if (baseTable == null) { throw new ArgumentNullException(nameof(baseTable)); } Stream stream = null; BinaryReader reader = null; baseTable.Items.Clear(); var props = TypeDescriptor.GetProperties(typeof(T)); try { stream = ioStream ?? new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); reader = new BinaryReader(stream); FieldDef[] fieldDefs = ReadFieldDefs(stream, reader, out int recSize); if (fieldDefs.Length > 0) { // read lines var rowBuf = new byte[recSize]; while (stream.Position < stream.Length) { // load table row data to buffer to increase speed int readSize = reader.Read(rowBuf, 0, recSize); // filling the row of the table from the buffer if (readSize == recSize) { var item = Activator.CreateInstance <T>(); var bufInd = 2; foreach (var fieldDef in fieldDefs) { bool isNull = fieldDef.AllowNull && rowBuf[bufInd++] > 0; var prop = props[fieldDef.Name]; if (prop != null) { var val = allowNulls && isNull ? null : BytesToObj(rowBuf, bufInd, fieldDef.DataType); prop.SetValue(item, val); } bufInd += fieldDef.DataSize; } baseTable.AddItem(item); } } } } catch (EndOfStreamException) { // normal file end situation } finally { if (fileMode) { reader?.Close(); stream?.Close(); } } }