Как изменить тип данных DataColumn в DataTable?

У меня есть:

DataTable Table = new DataTable; SqlConnection = new System.Data.SqlClient.SqlConnection("Data Source=" + ServerName + ";Initial Catalog=" + DatabaseName + ";Integrated Security=SSPI; Connect Timeout=120"); SqlDataAdapter adapter = new SqlDataAdapter("Select * from " + TableName, Connection); adapter.FillSchema(Table, SchemaType.Source); adapter.Fill(Table); DataColumn column = DataTable.Columns[0]; 

Я хочу сделать следующее:

Предположим, что в настоящее время column.DataType.Name является «Double» . Я хочу, чтобы он стал «Int32» .

Как мне это достичь?

Вы не можете изменить DataType после заполнения Datatable данными. Однако вы можете клонировать таблицу данных, изменять тип столбца и загружать данные из предыдущей таблицы данных в клонированную таблицу, как показано ниже.

 DataTable dtCloned = dt.Clone(); dtCloned.Columns[0].DataType = typeof(Int32); foreach (DataRow row in dt.Rows) { dtCloned.ImportRow(row); } 

Хотя верно, что вы не можете изменить тип столбца после заполнения DataTable , вы можете изменить его после вызова FillSchema , но прежде чем вы вызовете Fill . Например, скажем, что третий столбец – это тот, который вы хотите конвертировать из double в Int32 , вы можете использовать:

 adapter.FillSchema(table, SchemaType.Source); table.Columns[2].DataType = typeof (Int32); adapter.Fill(table); 

Рассмотрим также изменение типа возврата:

 select cast(columnName as int) columnName from table 
 Dim tblReady1 As DataTable = tblReady.Clone() '' convert all the columns type to String For Each col As DataColumn In tblReady1.Columns col.DataType = GetType(String) Next tblReady1.Load(tblReady.CreateDataReader) 

Старый пост, но я думал, что буду взлетать с расширением DataTable, которое может конвертировать один столбец за раз, в заданный тип:

 public static class DataTableExt { public static void ConvertColumnType(this DataTable dt, string columnName, Type newType) { using (DataColumn dc = new DataColumn(columnName + "_new", newType)) { // Add the new column which has the new type, and move it to the ordinal of the old column int ordinal = dt.Columns[columnName].Ordinal; dt.Columns.Add(dc); dc.SetOrdinal(ordinal); // Get and convert the values of the old column, and insert them into the new foreach (DataRow dr in dt.Rows) dr[dc.ColumnName] = Convert.ChangeType(dr[columnName], newType); // Remove the old column dt.Columns.Remove(columnName); // Give the new column the old column's name dc.ColumnName = columnName; } } } 

Затем он может быть вызван следующим образом:

 MyTable.ConvertColumnType("MyColumnName", typeof(int)); 

Конечно, используя любой тип, который вы желаете, до тех пор, пока каждое значение в столбце может быть фактически преобразовано в новый тип.

Я принял совсем другой подход. Мне нужно было проанализировать datetime из импорта excel, который был в формате даты OA. Эта методология достаточно проста, чтобы строить из … по существу,

  1. Добавить столбец типа, который вы хотите
  2. Пролистайте строки, преобразующие значение
  3. Удалите исходный столбец и переименуйте его в новое, чтобы совместить старый

     private void ChangeColumnType(System.Data.DataTable dt, string p, Type type){ dt.Columns.Add(p + "_new", type); foreach (System.Data.DataRow dr in dt.Rows) { // Will need switch Case for others if Date is not the only one. dr[p + "_new"] =DateTime.FromOADate(double.Parse(dr[p].ToString())); // dr[p].ToString(); } dt.Columns.Remove(p); dt.Columns[p + "_new"].ColumnName = p; } 

Как только DataTable будет заполнен, вы не сможете изменить тип столбца.

Ваш лучший вариант в этом сценарии – добавить столбец Int32 в DataTable перед его заполнением:

 dataTable = new DataTable("Contact"); dataColumn = new DataColumn("Id"); dataColumn.DataType = typeof(Int32); dataTable.Columns.Add(dataColumn); 

Затем вы можете клонировать данные из исходной таблицы в новую таблицу:

 DataTable dataTableClone = dataTable.Clone(); 

Вот сообщение с более подробной информацией .

если вы хотите изменить только столбец. Например, из строки в int32 вы можете использовать выражение.

 DataColumn col = new DataColumn("col_int" , typeof(int)); table.columns.Add(col) col.Expression = "table_exist_col_string"; // digit string convert to int 

Я создал функцию расширения, которая позволяет изменять тип столбца DataTable. Вместо клонирования всей таблицы и импорта всех данных она просто клонирует столбец, анализирует значение и затем удаляет оригинал.

  ///  /// Changes the datatype of a column. More specifically it creates a new one and transfers the data to it ///  /// The source column /// The target type /// A lambda function for converting the value public static void ChangeType(this DataColumn column, Type type, Func parser) { //no table? just switch the type if (column.Table == null) { column.DataType = type; return; } //clone our table DataTable clonedtable = column.Table.Clone(); //get our cloned column DataColumn clonedcolumn = clonedtable.Columns[column.ColumnName]; //remove from our cloned table clonedtable.Columns.Remove(clonedcolumn); //change the data type clonedcolumn.DataType = type; //change our name clonedcolumn.ColumnName = Guid.NewGuid().ToString(); //add our cloned column column.Table.Columns.Add(clonedcolumn); //interpret our rows foreach (DataRow drRow in column.Table.Rows) { drRow[clonedcolumn] = parser(drRow[column]); } //remove our original column column.Table.Columns.Remove(column); //change our name clonedcolumn.ColumnName = column.ColumnName; } } 

Вы можете использовать его так:

 List lsColumns = dtData.Columns .Cast() .Where(i => i.DataType == typeof(decimal)) .ToList() //loop through each of our decimal columns foreach(DataColumn column in lsColumns) { //change to double column.ChangeType(typeof(double),(value) => { double output = 0; double.TryParse(value.ToString(), out output); return output; }); } 

Вышеприведенный код меняет все десятичные столбцы на два.

 DataTable DT = ... // Rename column to OLD: DT.Columns["ID"].ColumnName = "ID_OLD"; // Add column with new type: DT.Columns.Add( "ID", typeof(int) ); // copy data from old column to new column with new type: foreach( DataRow DR in DT.Rows ) { DR["ID"] = Convert.ToInt32( DR["ID_OLD"] ); } // remove "OLD" column DT.Columns.Remove( "ID_OLD" ); 
  • Как вы знаете переменный тип в java?
  • Условный оператор не может действовать неявно?
  • В чем причина ошибки этого типа?
  • .NET: Как вы получаете Тип нулевого объекта?
  • Каковы различия между типами значений и ссылочными типами в C #?
  • длинный длинный в C / C ++
  • Как определить разные типы для одного и того же classа в C ++
  • Рекомендации по хранению почтовых адресов в базе данных (РСУБД)?
  • Где в памяти мои переменные, хранящиеся в C?
  • Какова цель вопросительного знака после типа (например: int? MyVariable)?
  • Тестирование, если объект имеет общий тип в C #
  • Interesting Posts

    Почему размер windows меньше ширины видового экрана, заданного в медиа-запросах

    Рисование сферы в OpenGL без использования gluSphere ()?

    Как отправить электронное письмо с помощью C # через Gmail

    Рекомендации по сериализации DateTime в .NET 3.5

    Проверка подлинности электронной почты с использованием регулярного выражения в JSF 2 / PrimeFaces

    Когда использовать intern () для строковых литералов

    OpenKML SDK: сделайте Excel пересчитанной формулой

    Как получить фиксированную позицию div для прокрутки по горизонтали с содержимым? Использование jQuery

    Разделить строку на массив символов

    Как вернуть число измерений переменной (Variant), переданной ей в VBA

    R, в которой говорится, что «Модели не были полностью приспособлены к одному и тому же размеру набора данных»

    Не удается получить доступ к файлам пользователей на HD, снятым с другого компьютера

    Pinnacle Studio 14 с ошибкой в ​​Windows 7 x64

    Как узнать, почему сбой на удалении файлов на Java?

    Перестановка шумовой монеты в круглую форму

    Давайте будем гением компьютера.