private void FillSchemaFromFieldDescriptorList(DataTable table) { foreach (FieldDescriptor fd in this.FieldDescriptors) { DataColumn col = new DataColumn(fd.FieldName); //DbaseIIIDataColumn col = new DbaseIIIDataColumn(fd.FieldName); col.DataType = typeof(object); //http://www.clicketyclick.dk/databases/xbase/format/data_types.html switch (fd.FieldType) { case 'C': //string < 254 chars col.DataType = typeof(string); //Below ensures we can fit an int's string representation since the original //length is specified in bytes for the char[]. Go larger if specified (like DES in HEADER.DBF). col.MaxLength = fd.FieldLength < 11 ? 11 : fd.FieldLength; col.SetByteLength(fd.FieldLength); break; case 'N': //int64 (up to 18 chars according to dBase spec) col.DataType = typeof(long); col.SetByteLength(fd.FieldLength); break; case 'L': //nullable bool, byte throw new NotImplementedException("Encountered /'L/' for nullable bool!"); break; case 'D': //YYYYMMDD throw new NotImplementedException("Encountered /'D/' for YYYYMMDD!"); break; case '@': //long1 = days since 1-Jan-4713 BC, long2 = hrs * 3600000 + min * 60000 + sec * 1000 throw new NotImplementedException("Encountered /'@/' for time!"); break; case 'O': //double (8 bytes) throw new NotImplementedException("Encountered /'O/' for double!"); break; case '+': //auto-increment (long) throw new NotImplementedException("Encountered /'+/' for auto-increment!"); break; } table.Columns.Add(col); } }