IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pGDBWorkSpace; IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(m_SDEDB_FeatureClassName); ITable pFCAttributeTable = (ITable)pFeatureClass; DT = ConvertITable(pFCAttributeTable, SortFields);
private DataTable ConvertITable(ITable table, string SortFields) { //Dennis Geasan - March 1, 2012 //Convert an ITable object to a .Net DataTable Object. // //Found the original code on ESRI Forums //http://forums.esri.com/Thread.asp?c=159&f=1707&t=209915 //wang chisheng Date Jan 18, 2007 // //The following may also be relavent for future work. //http://edndoc.esri.com/arcobjects/9.2/NET/a6eb84fb-93db-4bc3-82a9-874d8890a8ca.htm // DataTable DatatableFromITable; DatatableFromITable = new DataTable("DatatableFromITable"); try { //First sort the table then convert that to a DataTable. // Create the TableSort object. ITableSort tableSort = new TableSortClass(); tableSort.Table = table; tableSort.Fields = SortFields; tableSort.set_Ascending(SortFields, true); tableSort.Sort(null); IQueryFilter que = new QueryFilterClass(); ICursor pCursor = tableSort.Rows; IRow pRow = pCursor.NextRow(); if (pRow != null) { //For this loop I need to define the data type on the column being added to the DataTable. //Get this from pRow.Fields.Field.Type. //You have to map every ESRI data type to .Net data types. Note that this has not been done for all field types. Modify as needed. for (int i = 0; i < pRow.Fields.FieldCount; i++) { //Add all of the FC columns to the DataTable object. DatatableFromITable.Columns.Add(pRow.Fields.get_Field(i).Name); //Determine the ESRI data type of the incoming fields. //This code example is skipping some types if (pRow.Fields.Field.Type != esriFieldType.esriFieldTypeBlob && pRow.Fields.Field.Type != esriFieldType.esriFieldTypeGeometry && pRow.Fields.Field.Type != esriFieldType.esriFieldTypeGlobalID && pRow.Fields.Field.Type != esriFieldType.esriFieldTypeGUID && pRow.Fields.Field.Type != esriFieldType.esriFieldTypeOID && pRow.Fields.Field.Type != esriFieldType.esriFieldTypeRaster && pRow.Fields.Field.Type != esriFieldType.esriFieldTypeXML) { switch (pRow.Fields.Field.Type) { case esriFieldType.esriFieldTypeString: DatatableFromITable.Columns[pRow.Fields.get_Field(i).Name].DataType = System.Type.GetType("System.String"); break; case esriFieldType.esriFieldTypeDate: DatatableFromITable.Columns[pRow.Fields.get_Field(i).Name].DataType = System.Type.GetType("System.DateTime"); break; case esriFieldType.esriFieldTypeDouble: DatatableFromITable.Columns[pRow.Fields.get_Field(i).Name].DataType = System.Type.GetType("System.Double"); break; case esriFieldType.esriFieldTypeInteger: DatatableFromITable.Columns[pRow.Fields.get_Field(i).Name].DataType = System.Type.GetType("System.Int32"); break; case esriFieldType.esriFieldTypeSingle: DatatableFromITable.Columns[pRow.Fields.get_Field(i).Name].DataType = System.Type.GetType("System.Single"); break; case esriFieldType.esriFieldTypeSmallInteger: DatatableFromITable.Columns[pRow.Fields.get_Field(i).Name].DataType = System.Type.GetType("System.Int16"); break; default: break; } } } //Now copy the data to a .Net DataRow and then a DataTable while (pRow != null) { DataRow pDataRow = DatatableFromITable.NewRow(); for (int j = 0; j < pCursor.Fields.FieldCount; j++) pDataRow = pRow.get_Value(j); DatatableFromITable.Rows.Add(pDataRow); pRow = pCursor.NextRow(); } } } catch (System.Exception ex) { //MessageBox.Show(ex.Message); m_Error = true; m_ErrorMessage = "Something went wrong while converting from ITable to DataTable.\n" + ex.Message; } //Apparently the following doesn't really sort the table. A DataView object derived from DataTable.DataView will be sorted. //DatatableFromITable.DefaultView.Sort = SortFields; return DatatableFromITable; }
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.