Копировать содержимое одного datatable в другой без использования клонирования или копирования

Я хочу скопировать содержимое из одной таблицы данных в другую без копирования или клонирования структуры данных. как лучше всего это сделать? Мне нужно сделать это таким образом, потому что мне предоставлена ​​таблица данных из хранимой процедуры SQL-сервера, и я не могу изменить данную таблицу только для чтения. поэтому мне нужно воссоздать его, не копируя всю базовую структуру. Я надеюсь, что в этом есть смысл.

С Уважением Амарино

почему оригинал, доступный только для чтения, препятствует копированию? Вы получаете сообщение об ошибке при этом? Обратите внимание, что клонирование вам не поможет, поскольку вы упомянули, что хотите сохранить контент (под этим, я полагаю, вы имеете в виду данные строки, поправьте меня, если я ошибаюсь).

ADyson 10.08.2018 16:02
copy content...without copy В этом нет смысла, и вы не предоставили никакого кода.
Dan Wilson 10.08.2018 16:02

Я добавил код, надеюсь, вопрос немного яснее.

Amar_H 10.08.2018 17:42
1
3
1 019
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Это простой способ скопировать данные из одной таблицы в другую, не беспокоясь о ключах или ограничениях. Вам нужно будет убедиться, что ваша целевая таблица может принимать данные (она должна быть правильного типа или вы должны привести ее к чему-то приемлемому).

Ответ принят как подходящий

Если вы хотите скопировать dataTable, у вас есть два варианта: сначала скопировать или клонировать. Второй вариант - использовать цикл foreach или for для копирования, вы можете получить любые столбцы из dataTable.

 int columnsize = dt.Columns.Count;
            foreach (DataRow X in dt.Rows)
            {
                for (int i = 0; i < columnsize; i++)
                {
                   // int bir = Convert.ToInt32(X[i]);
                   // you can set here your need dataTable

}


            }
// then here new dataTable you can assing to any datagridview.DataSource = newDataTable

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

вот мой код использования

    DataTable dh1 = new DataTable("data1");

    dh1.Columns.Add("specification_name", typeof(string));
    dh1.Columns.Add("summalar", typeof(string));
    dh1.Columns.Add("address", typeof(string));
    dh1.Columns.Add("id1", typeof(int));
    dh1.Columns.Add("client_id", typeof(int));
    dh1.Columns.Add("stack_id", typeof(int));
    foreach (DataRow dd in dt.Rows) 
    {

        DataTable temp = new DataTable("temp");
        DataRow ttt = dh1.NewRow();

        for (int j = 0; j < col; j++) 
        {

                ttt[0] = dd[1];
                ttt[1] = dd[2];
                ttt[2] = dd[3];
                ttt[3] = dd[4];
                ttt[4] = dd[5];
                ttt[5] = dd[6];
                break;


        }
        dh1.Rows.Add(ttt);





    }

вам не нужно правильно настраивать новые столбцы данных? например, убедитесь, что ваш datatable имеет правильное количество столбцов и столбцы правильного типа?

Amar_H 10.08.2018 16:18

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

Mansur Otabekov 10.08.2018 16:22

Я хотел сделать что-то вроде этого: DataTable lDT3 = new DataTable (); foreach (столбец DataColumn в lDT2.Columns) {lDT3.Columns.Add (col.ColumnName, col.DataType); } // foreach (DataRow dr in lDT2.Rows) {// lDT3.Rows.Add (dr.ItemArray); //} for (int i = 1; i <lDT2.Rows.Count; i ++) {for (int j = 0; j <lDT2.Columns.Count; j ++) {lDT3.add (i, j) = lDT2. Строки [j] [i] .ToString (); }}

Amar_H 10.08.2018 16:56

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

Amar_H 10.08.2018 17:41

Ваш ответ помог мне найти решение, в котором я нуждался. Я обновил свой вопрос ответом.

Amar_H 10.08.2018 17:48

@Amar_H "Я обновил свой вопрос ответом" ... нет, вопрос должен оставаться вопросом. Примите ответ, который решает проблему, или, если вы считаете, что у вас есть лучшее решение, напишите свой собственный ответ - но в разделе «Ответы», а не в исходном вопросе - спасибо.

ADyson 10.08.2018 18:01

Другой вариант - использовать DefaultView.ToTable (). Это также позволяет извлекать DISTINCT значения. Если вы хотите, чтобы все столбцы

var myNewTable = ExistingDataTable.DefaultView().ToTable();

Если вы хотели ограничить по каким-то критериям

var dv = ExistingDataTable.DefaultView();
dv.Filter = "SomeColumn = 'SomeValue'";
var myFilteredTable = dv.ToTable();

Я хотел сделать что-то вроде этого: приведенное ниже решение работает для меня.

DataTable lDT2 = someMethod(); //populated with data from SomeMethod()
DataTable lDT3 = new DataTable();

lDT3.Columns.Add("Name", typeof(string));
lDT3.Columns.Add("Name2", typeof(string));
foreach (DataColumn col in lDT2.Columns) {
    lDT3.Columns.Add(col.ColumnName, col.DataType);
}

foreach (DataRow dr in lDT2.Rows) {
   DataRow lDT3dr = lDT3.NewRow();
   for (int i = 0; i < lDT2.Columns.Count; i++) {
       if (i == 0) { lDT3dr[i] = "some info"; }
       if (i == 1) { lDT3dr[i] = "more info"; }
       lDT3dr[i+2] = dr[i];
    }
    lDT3.Rows.Add(lDT3dr);
}

Другие вопросы по теме