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 } }
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); }
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; }