Проблемы с удалением строк из набора данных в C # - PullRequest
1 голос
/ 06 сентября 2010

У меня такая ситуация: мне нужно создать набор данных, который берет все данные из другого набора данных.В некоторых случаях мне нужно удалить несколько строк из каждого нового набора данных.Когда оба цикла foreach завершены, оба набора данных пусты, даже когда заканчивается только первый, первый набор данных содержит несколько строк.

Любая идея, почему, ... или укажите, где у меня неправильный код.

Спасибо заранее.

//Dataset comes as a parameter.    
DataSet dsFirst = ds;
DataSet dsSecond = ds;

foreach (DataRow dr in dsFirst.Tables[0].Select())
{
    int i = Convert.ToInt32(dr["ROWNUMBER"]);
    //merren vetem veprimet ATM qe jane bere para CoB
    if (i > x && i < y)
        dr.Delete();
    else
        dr["NOVATRANSAKCIJA"] = 0;//eshte derguar njehere, per rrjedhoje nuk do te dergohet sms
}
dsFirst.AcceptChanges();

foreach (DataRow dr1 in dsSecond.Tables[0].Select())
{
    int i = Convert.ToInt32(dr1["ROWNUMBER"]);
    //merren veprimet e sistemit dhe veprimet ATM te bera gjate CoB
    if (i < x || i > y)
        dr1.Delete();
    else
        dr1["NOVATRANSAKCIJA"] = 1;//nuk eshte derguar asnjehere, per rrjedhoje do te dergohet sms

}
dsSecond.AcceptChanges();

Ответы [ 3 ]

3 голосов
/ 06 сентября 2010

Как уже отметил Марк, вы работаете здесь со значениями ссылочного типа, поэтому вы фактически указываете с помощью ds, dsFirst и dsSecond на один и тот же набор данных. Вы должны сделать копию своего набора данных, чтобы достичь того, что вы хотите сделать.

попробовать

dsFirst = ds.Copy(); 
dsSecond = ds.Copy();

вместо этого, что клонирует структуру и копирует данные.

1 голос
/ 06 сентября 2010

Как ваш код сейчас, dsFirst и dsSecond не являются копиями исходного набора данных, но "указывают" на тот же набор данных!

Чтобы скопировать набор данных и удалить строки на ходу, я бы сделал следующее:

foreach (DataRow dr in ds.Tables[0].Rows)
{
    int i = Convert.ToInt32(dr["ROWNUMBER"]);
    if (i <= x || i >= y)
      dsFirst.Tables[0].ImportRow(row);
}

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

Возможно, вы сможете создать копию ds, содержащую соответствующие таблицы и определения столбцов, используя ds.Clone(), но я еще не пробовал. Работа с типизированными наборами данных экономит вам много работы, поскольку вы можете создать столько экземпляров, сколько захотите, и все таблицы и столбцы уже определены.

1 голос
/ 06 сентября 2010

У вас есть только один набор данных (из вашего кода):

DataSet dsFirst = ds;
DataSet dsSecond = ds;

Копирование ссылки не клонирует данные - это просто еще одна ссылка на тот же набор данных . Таким образом, вы просто удалили все данные. Вы можете посмотреть на метод Clone() (но обратите внимание, что копируется структура , но не данные ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...