Jak dodać nową kolumnę i dane do bazy danych, która już zawiera dane?

81

Jak dodać nowy DataColumndo DataTableobiektu, który już zawiera dane?

Pseudo kod

//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
}
Michael Kniskern
źródło

Odpowiedzi:

126

Po prostu kontynuuj ze swoim kodem - jesteś na dobrej drodze:

//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
źródło
Czy musiałeś zadzwonić dt.AcceptChanges()po dodaniu nowej kolumny i wartości?
Michael Kniskern
2
@Michael: nie, nie bardzo. Twój zestaw danych jest teraz przygotowany z tymi nowymi wartościami. Jeśli chcesz go zapisać, musisz mieć jakąś metodę, aby zapisać go z powrotem (za pomocą SqlDataAdapter lub w inny sposób). AcceptChanges () nic nie da (poza oznaczeniem tych zmian jako „zaakceptowanych” -> nie zostaną one wykryte do zapisania przy następnym zapisaniu danych!)
marc_s
13

Czy nie powinno być foreachzamiast dla !?

//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 
} 
Imir Hoxha
źródło
7

Oto alternatywne rozwiązanie zmniejszające zapętlenie For / ForEach, skracające czas zapętlania i szybkie aktualizacje :)

 dt.Columns.Add("MyRow", typeof(System.Int32));
 dt.Columns["MyRow"].Expression = "'0'";
Akxaya
źródło
2
@Akxaya, czy mógłbyś opisać, jak działa to rozwiązanie?
Mikael Dúi Bolinder
DataTable dt = sql.ExecuteDataTable ("sp_MyProc"); // dt.Columns.Add ("MyRow", typeof (System.Int32)); dt.Columns ["MyRow"]. Expression = "'0'";
Akxaya,
6

Tylko chcesz ustawić parametr wartości domyślnej. To wywołanie trzeciej metody przeciążania.

dt.Columns.Add("MyRow", type(System.Int32),0);
Nishantha
źródło
2

Spróbuj tego

> 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;
Himanshu Shukla
źródło