Ejemplo n.º 1
0
        private static void GetFieldDescriptorListFromSchema(DbfFile file)
        {
            //http://www.clicketyclick.dk/databases/xbase/format/data_types.html

            file.FieldDescriptors = new List <DbfFile.FieldDescriptor>();

            int fieldAddr = 1; //first is always 1

            foreach (DataColumn col in file.DataTable.Columns)
            {
                DbfFile.FieldDescriptor fd = col.GetFieldDescriptor();
                fd.FieldDataAddress = BitConverter.GetBytes(fieldAddr);
                //FieldDataAddress is the index/offset of this field's data in a record, if the records were byte arrays
                file.FieldDescriptors.Add(fd);
                fieldAddr += fd.FieldLength; //sum each previous column's ByteLength, which equals the FieldLength
            }
        }
Ejemplo n.º 2
0
        internal static DbfFile.FieldDescriptor GetFieldDescriptor(this DataColumn dc)
        {
            DbfFile.FieldDescriptor fd = new DbfFile.FieldDescriptor();

            fd.FieldName   = dc.ColumnName;
            fd.FieldLength = dc.GetByteLength();

            fd.DecimalCount         = 0;
            fd.WorkAreaId           = 0;
            fd.ReservedMultiUserOne = Enumerable.Repeat <byte>(0x0, 2).ToArray();
            fd.ReservedMultiUserTwo = Enumerable.Repeat <byte>(0x0, 2).ToArray();
            fd.FlagSetFields        = 0;
            fd.Reserved             = Enumerable.Repeat <byte>(0x0, 7).ToArray();
            fd.IndexFieldFlag       = 0;

            if (dc.DataType == typeof(string))
            {
                fd.FieldType = 'C';
            }
            else if (dc.DataType == typeof(long))
            {
                fd.FieldType = 'N';               //int64 (up to 18 chars according to dBase spec)
            }
            else if (dc.DataType == typeof(bool)) //nullable bool, byte
            {
                fd.FieldType = 'L';
            }
            else if (dc.DataType == typeof(double)) //double (8 bytes)
            {
                fd.FieldType = 'O';
            }
            //else if (this.DataType == typeof(dBaseShortDate)) //YYYYMMDD
            //    fd.FieldType = 'D';
            //else if (this.DataType == typeof(dBaseTimestamp)) //long1 = days since 1-Jan-4713 BC, long2 = hrs * 3600000 + min * 60000 + sec * 1000
            //    fd.FieldType = '@';
            //else if (this.DataType == typeof(dbaseAutoIncrement)) //auto-increment (long)
            //    fd.FieldType = '+';
            else
            {
                throw new Exception($"Unknown column type: \'{dc.ColumnName}\' is {dc.DataType.ToString()}");
            }

            return(fd);
        }
Ejemplo n.º 3
0
        internal static DbfFile.FieldDescriptor GetFieldDescriptor(this DataColumn dc)
        {
            DbfFile.FieldDescriptor fd = new DbfFile.FieldDescriptor();

            fd.FieldName = dc.ColumnName;
            fd.FieldLength = dc.GetByteLength();

            fd.DecimalCount = 0;
            fd.WorkAreaId = 0;
            fd.ReservedMultiUserOne = Enumerable.Repeat<byte>(0x0, 2).ToArray();
            fd.ReservedMultiUserTwo = Enumerable.Repeat<byte>(0x0, 2).ToArray();
            fd.FlagSetFields = 0;
            fd.Reserved = Enumerable.Repeat<byte>(0x0, 7).ToArray();
            fd.IndexFieldFlag = 0;

            if (dc.DataType == typeof(string))
            {
                fd.FieldType = 'C';
            }
            else if (dc.DataType == typeof(long))
            {
                fd.FieldType = 'N'; //int64 (up to 18 chars according to dBase spec)
            }
            else if (dc.DataType == typeof(bool)) //nullable bool, byte
                fd.FieldType = 'L';
            else if (dc.DataType == typeof(double)) //double (8 bytes)
                fd.FieldType = 'O';
            //else if (this.DataType == typeof(dBaseShortDate)) //YYYYMMDD
            //    fd.FieldType = 'D';
            //else if (this.DataType == typeof(dBaseTimestamp)) //long1 = days since 1-Jan-4713 BC, long2 = hrs * 3600000 + min * 60000 + sec * 1000
            //    fd.FieldType = '@';
            //else if (this.DataType == typeof(dbaseAutoIncrement)) //auto-increment (long)
            //    fd.FieldType = '+';
            else
                throw new Exception($"Unknown column type: \'{dc.ColumnName}\' is {dc.DataType.ToString()}");

            return fd;
        }