Сравните два набора данных в C # - PullRequest
4 голосов
/ 11 августа 2009

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

Например:

Id in One dataset        ID in second Dataset       
1                          1
2                          2
3                          4

Мне нужно вставить идентификатор 3 во второй набор данных.

Вот мой код для справки:

if (ds.Tables[0].Rows.Count > 0 || clientDS.Tables[0].Rows.Count > 0)
        {
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                for (int j = 0; j < clientDS.Tables[0].Rows.Count; j++)
                {
                    if (ds.Tables[0].Rows[i]["Id"].ToString() == clientDS.Tables[0].Rows[j]["Id"].ToString())
                    {
                        client.GetSingleValue("update customers set Name='" + ds.Tables[0].Rows[i]["Name"].ToString() + "',ContactPerson= '" + ds.Tables[0].Rows[i]["ContactPerson"].ToString() + "',Address='" + ds.Tables[0].Rows[i]["Address"].ToString() + "',TinNo='" + ds.Tables[0].Rows[i]["TinNo"].ToString() + "',ContactNo='" + ds.Tables[0].Rows[i]["Contactno"].ToString() + "',Report=  '" + ds.Tables[0].Rows[i]["Report"].ToString() + "',Sync=0,Ids='" + ds.Tables[0].Rows[i]["Id"].ToString() + "' where id='" + ds.Tables[0].Rows[i]["Id"].ToString() + "' ");
                    }
                    else
                    {
                        client.GetSingleValue("insert into customers(id,Name,ContactPerson,Address,TinNo,ContactNo,Report,Sync,Ids) values('" + ds.Tables[0].Rows[i]["Id"].ToString() + "',  '" + ds.Tables[0].Rows[i]["Name"].ToString() + "','" + ds.Tables[0].Rows[i]["ContactPerson"].ToString() + "',  '" + ds.Tables[0].Rows[i]["Address"].ToString() + "',  '" + ds.Tables[0].Rows[i]["TinNo"].ToString() + "',  '" + ds.Tables[0].Rows[i]["Contactno"].ToString() + "',  '" + ds.Tables[0].Rows[i]["Report"].ToString() + "',0,'" + ds.Tables[0].Rows[i]["Id"].ToString() + "')");
                    }
                }
            }
        }  

Выше код не работает. Просьба исправить мою проблему.

Спасибо

Ответы [ 4 ]

7 голосов
/ 11 августа 2009

Используйте метод слияния:

Dataset2.Merge(Dataset1);

Это вставит в Dataset2 все записи, которые есть в Dataset1, но еще не в Dataset2. Примечание: ваш оригинальный вопрос предполагает, что вам нужно вставить записи или обновить соответствующие записи из набора данных1, но ваши комментарии, похоже, указывают на то, что вам на самом деле не нужно делать обновление. Метод Merge будет вставлять только новые записи из набора данных 1.

3 голосов
/ 24 марта 2012
DataSet data1
DataSet data2

data1.Merge(data2,true)

объединит data2 в data1, не перезаписывая строки с одинаковым первичным ключом, и добавит строки с несуществующим первичным ключом в data1.

data1.Merge(data2,false)

объединит data2 в data1 с перезаписью всех строк и добавит новые строки

2 голосов
/ 11 августа 2009

Я думаю, что ваша ошибка при сравнении строки Id с использованием ==. Попробуйте использовать Equals. Я бы просто использовал foreach и выбрал вместо этого:

foreach (DataRow row in ds.Tables[0].Rows)
{
    string filter = string.Format("Id = '{0}'", row["Id"]);
    DataRow[] rows = clientDS.Tables[0].Select(filter);
    if (rows.length == 0)
    {
        // insert here
    }
    else
    {
        // update here
    }
}
1 голос
/ 11 августа 2009

Добавьте обе эти таблицы (экземпляры DataTable) в DataSet и добавьте отношение.

DataSet ds = new DataSet (); ds.EnforceConstraints = false;

DataTable dt1 = new DataTable("A");
DataTable dt2 = new DataTable("B");

dt1.Columns.Add("ID", typeof(int));
dt1.PrimaryKey = new DataColumn[] {dt1.Columns[0]};
dt1.Rows.Add(1);
dt1.Rows.Add(2);
dt1.Rows.Add(3);

dt2.Columns.Add("ID", typeof(int));
dt2.Rows.Add(1);
dt2.Rows.Add(2);
dt2.Rows.Add(4);

ds.Tables.Add(dt1);
ds.Tables.Add(dt2);
ds.Relations.Add("ID_REL", dt1.Columns[0], dt2.Columns[0]);

foreach (DataRow r in ds.Tables["A"].Rows)
{
    DataRow []child=r.GetChildRows("ID_REL");
    Console.Write(r[0] + " " );
    if (child.Length != 0)
        Console.WriteLine(child[0][0]);

    Console.WriteLine();
}
...