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