Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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;
        }