Как я могу добавить новый столбец и данные в таблицу данных, которая уже содержит данные?

81

Как мне добавить новое DataColumnк DataTableобъекту, который уже содержит данные?

Псевдокод

//call SQL helper class to get initial data 
DataTable dt = sql.ExecuteDataTable("sp_MyProc");

dt.Columns.Add("NewColumn", type(System.Int32));

foreach(DataRow row in dr.Rows)
{
    //need to set value to NewColumn column
}
Майкл Книскерн
источник

Ответы:

126

Просто продолжайте использовать свой код - вы на правильном пути:

//call SQL helper class to get initial data 
DataTable dt = sql.ExecuteDataTable("sp_MyProc");

dt.Columns.Add("NewColumn", typeof(System.Int32));

foreach(DataRow row in dt.Rows)
{
    //need to set value to NewColumn column
    row["NewColumn"] = 0;   // or set it to some other value
}

// possibly save your Dataset here, after setting all the new values
marc_s
источник
Вам нужно было позвонить dt.AcceptChanges()после того, как я добавил новый столбец и значение?
Майкл Книскерн,
2
@ Майкл: нет, не совсем. Ваш набор данных теперь подготовлен с этими новыми значениями. Если вы хотите сохранить его, вам нужен какой-то метод для его записи (через SqlDataAdapter или каким-либо другим способом). AcceptChanges () ничего не сделает (кроме пометки этих изменений как «принятые» -> они не будут обнаружены для сохранения при следующем сохранении данных!)
marc_s
13

Не должно быть foreachвместо for !?

//call SQL helper class to get initial data  
DataTable dt = sql.ExecuteDataTable("sp_MyProc"); 

dt.Columns.Add("MyRow", **typeof**(System.Int32)); 

foreach(DataRow dr in dt.Rows) 
{ 
    //need to set value to MyRow column 
    dr["MyRow"] = 0;   // or set it to some other value 
} 
Имир Ходжа
источник
7

Вот альтернативное решение для уменьшения цикла For / ForEach, это уменьшит время цикла и быстро обновит :)

 dt.Columns.Add("MyRow", typeof(System.Int32));
 dt.Columns["MyRow"].Expression = "'0'";
Akxaya
источник
2
@Akxaya, не могли бы вы подробнее рассказать, как работает это решение?
Mikael Dúi Bolinder
Таблица данных dt = sql.ExecuteDataTable ("sp_MyProc"); // dt.Columns.Add ("MyRow", typeof (System.Int32)); dt.Columns ["MyRow"]. Выражение = "'0'";
Akxaya
6

Только вы хотите установить параметр значения по умолчанию. Это вызывает третий метод перегрузки.

dt.Columns.Add("MyRow", type(System.Int32),0);
Нишанта
источник
2

Попробуй это

> dt.columns.Add("ColumnName", typeof(Give the type you want));
> dt.Rows[give the row no like  or  or any no]["Column name in which you want to add data"] = Value;
Химаншу Шукла
источник