DbfFieldDescriptor ReadFieldDescriptor(BinaryReader br, int fdNo) { var fieldDescriptor = new DbfFieldDescriptor(); fieldDescriptor.No = fdNo; try { var fieldNameBytes = new byte[11]; fieldNameBytes[0] = br.ReadByte(); if (fieldNameBytes[0] == 0x0D) { return(null); // 0x0D means end of field descriptor list } br.Read(fieldNameBytes, 1, 10); fieldDescriptor.Name = System.Text.Encoding.ASCII.GetString(fieldNameBytes).TrimEnd('\0'); fieldDescriptor.TypeChar = (char)br.ReadByte(); br.ReadByte(); // reserved br.ReadByte(); // reserved br.ReadByte(); // reserved br.ReadByte(); // reserved fieldDescriptor.Length = br.ReadByte(); fieldDescriptor.DecimalCount = br.ReadByte(); br.ReadBytes(2); // work area id br.ReadByte(); // example br.ReadBytes(10); // reserved br.ReadByte(); // production mdx return(fieldDescriptor); } catch (Exception e) { if (string.IsNullOrWhiteSpace(fieldDescriptor.Name)) { throw new Exception($"Failed to read field descriptor #{fdNo + 1}", e); } else { throw new Exception($"Failed to read field descriptor #{fdNo + 1} ({fieldDescriptor.Name})", e); } } }
private object ReadField(DbfFieldDescriptor fd) { var data = binaryReader.ReadBytes(fd.Length); switch (fd.TypeChar) { case 'C': return(ReadFieldText(data)); case 'I': return(ReadFieldInteger(data)); case 'N': return(ReadFieldNumeric(data)); case 'L': return(ReadFieldLogical(data)); case 'D': return(ReadFieldDate(data)); case 'M': return(ReadFieldMemo(data)); case 'T': return(ReadFieldTime(data)); case 'W': //? return(null); case '0' : // _NullFlags? https://stackoverflow.com/questions/30886730/adding-data-to-dbf-file-adds-column-nullflags return(null); } throw new NotSupportedException($"Field type ({fd.TypeChar})"); }
public ObjectToDbfTypeMap(DbfFieldDescriptor fieldType, Func <T, object> mapFunction) { FieldType = fieldType; MapFunction = mapFunction; }