Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сравнить два DataSet'a ? / 25 сообщений из 41, страница 1 из 2
16.03.2004, 11:36
    #32443109
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
... с тем, чтобы их синхронизировать. то есть записи отсутствующие в одноименной таблице первого датасета взять из второго и затем наоборот появившиеся новые записи в первом записать во второй.

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
16.03.2004, 11:46
    #32443142
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Есть такой метод Merge
...
Рейтинг: 0 / 0
16.03.2004, 12:11
    #32443212
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Спасибо. Как говорится - будем посмотреть :).

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
16.03.2004, 16:55
    #32444087
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
не получается сохранить результат в БД...
Код: plaintext
1.
2.
3.
dataSet1.Merge(dataSet2);
dataSet1.AcceptChanges();
oleDbDataAdapter1.Update(dataSet1);

после этого открываю ацессом БД а там всё старое, хотя в гриде на моей форме отображается правильный т.е. обновлённый датасет dataSet1.

Туплю? Очччень вероятно :), но где?

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 07:59
    #32444649
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Вообще сделай DataWizard да и посмотри какой он все разруливает.

Я лично отрабатываю DataSet в такой последовательности:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//Измененные DataRowState.Modified
DataSet changedDataSet = m_dataset.GetChanges(DataRowState.Deleted);
// изменяем в БД 

//Удаленные (Соответсвенное )
DataSet changedDataSet = m_dataset.GetChanges(DataRowState.Modified);
// удаляем в БД

//Добавленнные
DataSet changedDataSet = m_dataset.GetChanges(DataRowState.Modified);
// вставляем changedDataSet  записи в БД 
Me.m_dataset.Merge(changedDataSet)
Me.m_dataset.AcceptChanges()
...
Рейтинг: 0 / 0
17.03.2004, 08:01
    #32444652
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Тьфу ты на me не смотри в C# это this писал по памяти и наполовину написал на VB.NET половину на C# :-)
но думаю идея понятна
...
Рейтинг: 0 / 0
17.03.2004, 11:55
    #32445103
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Я что-то с трудом понимаю на счёт этих .GetChanges().
На мой взгляд мне это ничего не даёт.
У меня несколько БД с одинаковой структурой, одна на сервере и несколько на клиентах, которые надо синхронизировать, т.е. новые записи появившиеся на сервере должны быть переданы клиенту и наоборот. То есть имеем два датасета, которые и надо сравнивать.

Вообще сделай DataWizard да и посмотри какой он все разруливает

Делал, он делает также как и я т.е. oleDbDataAdapter1.Update(dataSet1);
Но у меня данные в БД не меняются а у него да.

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 12:34
    #32445186
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Код: plaintext
1.
2.
3.
dataSet1.Merge(dataSet2);
dataSet1.AcceptChanges();
oleDbDataAdapter1.Update(dataSet1);


А если так:

Код: plaintext
1.
2.
3.
dataSet1.Merge(dataSet2);
oleDbDataAdapter1.Update(dataSet1);
dataSet1.AcceptChanges();
...
Рейтинг: 0 / 0
17.03.2004, 12:39
    #32445204
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Так я тоже пробовал - не работает.

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 12:58
    #32445252
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Проверь а что возвращает метод DataSet HasChanges()
...
Рейтинг: 0 / 0
17.03.2004, 13:17
    #32445311
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Что мне это даст? У меня 2 датасета от двух РАЗНЫХ БД с одинаковой структурой. Да и дело не в том - результирующий-то датасет правильный, всё работает, только вот в БД не записывается.

oleDbDataAdapter1.Update(dataSet1);

Вот это вот ДОЛЖНО работать, но почему-то в БД никаких изменений.


Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 13:52
    #32445397
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Ну HasChanges вернет вообще если какие либо изменения в DataSet или нет. М ожно также getChanges прогнать чтобы узнать что то вообще меняется или нет.

Ну причин может и до и больше.
Начать можно и с адаптера.

Сам его писал или визардом сделал? что вызывается storedProcedure или sql- запрос. Какой sql- запрос. или динамически update генеришь, какой? Выдается ли какая ошибка?

Побольше от тебя информация и поболе будет понятно в чем проблема.

P.S. И еще AcceptChanges всегда помещается уже после Update этот метод принимает изменения совершенные базой данных.
...
Рейтинг: 0 / 0
17.03.2004, 14:26
    #32445466
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
посмотрите это\r
\r
/topic/61041
...
Рейтинг: 0 / 0
17.03.2004, 14:41
    #32445515
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Вот набросал тестовое приложение. На форме лежат два датагрида, 4-е кнопки
+
oleDbDataAdapter1
oleDbConnection1
dataSet11
+
oleDbDataAdapter2
oleDbConnection2
dataSet21

первый грид связан с датасет11, второй с датасет21
кнопки 1 и 3 : заполняют датасеты данными из БД (успешно)

кнопка 2: добавлена в тестовых целях, если я вручную в гриде что-либо изменю и нажму на эту кнопку, то изменения заносятся в БД (снова успешно)
заметьте без всяких dataSet11.AcceptChanges();

кнопка 4: здесь находятся все проблемы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace DateUpdate
{
	public class Form1 : System.Windows.Forms.Form
	{
.
.
.
bla-bla-bla
.
.
.

		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		private void button1_Click(object sender, System.EventArgs e)
		{
			oleDbDataAdapter1.Fill(dataSet11);
			dataSet11.AcceptChanges();

		}

		private void button2_Click(object sender, System.EventArgs e)
		{
			oleDbDataAdapter1.Update(dataSet11);
		}

		private void button3_Click(object sender, System.EventArgs e)
		{
		oleDbDataAdapter2.Fill(dataSet21);
		
		}

		private void button4_Click(object sender, System.EventArgs e)
		{
			dataSet11.Merge(dataSet21);
                                      // после этого в гриде связанном с dataSet11
                                      // я вижу результат, который мне нужен, но
                                     // следующая команда не работает

			oleDbDataAdapter1.Update(dataSet11);
			dataSet11.AcceptChanges();
			
			if (dataSet11.HasChanges()==true) 
			{
				label1.Text= "true" ;
			}
			else
			{
				label1.Text= "false" ;
			}
			// показывает false
		}
	}
}



Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 15:07
    #32445573
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
oleDbDataAdapter1.Update(dataSet11);
dataSet11.AcceptChanges();

if (dataSet11.HasChanges()==true) 
{
label1.Text= "true" ;
}
else
{
label1.Text= "false" ;
}
// показывает false



Мне интересно посмотреть HasChanges не после того как ты данные уже закоммитил AcceptChanges() ом а до него до Update вообще.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
if (dataSet11.HasChanges()==true) 
{
label1.Text= "true" ;
}
else
{
label1.Text= "false" ;
}
// что показывает?



oleDbDataAdapter1.Update(dataSet11);
dataSet11.AcceptChanges();




Это снимет лишнии дерганья.
...
Рейтинг: 0 / 0
17.03.2004, 15:17
    #32445602
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
тоже false

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 15:41
    #32445674
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
hDrummer прав, тебе надо туда по его ссылке.
...
Рейтинг: 0 / 0
17.03.2004, 16:13
    #32445764
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
А вот так выдаёт true, но попрежнему не работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dataSet11.Merge(dataSet21,true);
if (dataSet11.HasChanges()==true) 
{
     label1.Text= "true" ;
}
else
{
    label1.Text= "false" ;
}
dataSet11.AcceptChanges();
oleDbDataAdapter1.Update(dataSet11);



А вот так выдаёт true и ошибку,говорит что команда упдате
подействовала на 0 записей

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dataSet11.Merge(dataSet21,true);
if (dataSet11.HasChanges()==true) 
{
     label1.Text= "true" ;
}
else
{
    label1.Text= "false" ;
}
//dataSet11.AcceptChanges();
oleDbDataAdapter1.Update(dataSet11);


По ссылке ходил, читал - не утешительно. Возникает вопрос: А на кой
тогда нужен ds1.Merge(ds2) ?!

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 18:42
    #32446098
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dataSet11.Merge(dataSet21,true);
if (dataSet11.HasChanges()==true) 
{
     label1.Text= "true" ;
}
else
{
    label1.Text= "false" ;
}
dataSet11.AcceptChanges();
oleDbDataAdapter1.Update(dataSet11);


Да на какой ляд ды данные в DataSet commitишь до Update?

Делай так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dataSet11.Merge(dataSet21,true);
if (dataSet11.HasChanges()==true) 
{
     label1.Text= "true" ;
}
else
{
    label1.Text= "false" ;
}
oleDbDataAdapter1.Update(dataSet11);
dataSet11.AcceptChanges();
...
Рейтинг: 0 / 0
17.03.2004, 18:56
    #32446121
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Вы невнимательно читали мой пост.
Во втором примере я как раз так и делаю и получаю ошибку, если dataSet1.AcceptChanges(); не стоит перед упдате
а здесь dataSet11.Merge(dataSet21,true); выставлено труе
.

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 19:06
    #32446141
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Да я прочитал, но также и очевидно что AcceptChanges() не ставиться перед Update поэтому можно перестать рассматривать другие варианты. Какая ошибка ? Дострочно можете ее привести здесь.
...
Рейтинг: 0 / 0
17.03.2004, 19:22
    #32446159
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Да, могу дострочно:

System.Data.DBConcurrencyException: Parallelitätsverletzung : Der UpdateCommand hat sich auf 0 Datensätze ausgewirkt.

Что можно перевести на русский так:

System.Data.DBConcurrencyException: Повреждение параллелности : UpdateCommand подействовал на 0 записей

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
17.03.2004, 19:53
    #32446189
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Да кажется по поводу построчно я погорячился :-)
ни шпрехен я.

Попробуй еще до update поставить следующее
this.BindingContext[dataSet1].EndCurrentEdit();

А вообще надо еще попробовать через GetChanges как делаю я . Это и правильно потому что для Update свой dataset, для Insert получается свой.
А самое главное что updatу отдается на съедение не весь DataSet а только изменившиеся его часть.
...
Рейтинг: 0 / 0
19.03.2004, 10:17
    #32448599
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
По вашему, это должно выглядеть так:

Код: plaintext
1.
2.
3.
DataSet changedDataSet =dataSet11.GetChanges(DataRowState.Modified);
dataSet11.Merge(changedDataSet);
dataSet11.AcceptChanges();


Но это же в моём случае бред. Получается, что я беру серерный датасет, смотрю есть ли там изменённые данные, их там естественно нет, и делаю мерге с 0 значением. Или я чего-то не понял? А куда же мне клиентский датасет пристроить и как мне ЕГО с серверным сравнить?

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
19.03.2004, 10:41
    #32448682
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два DataSet'a ?
Давай уточним постановку:
Есть две БД: БД1 и БД2. Соответственно к ним два DataSet: ds1, ds2.
БД1 и БД2 - одинаковы по структуре.

Цель: Слить данные из БД2 в БД1.

Вопросы:
1) правильно я понял твою задачу?
2) какое количество таблиц в ds1 и ds2?
3) могут ли записи в ds1 и ds2 совпадать?
4) что надо делать если записи из ds1 и ds2 совпадают по идентификатору но не по содержанию. Оставить в ds1 как есть, переписать их из ds2. Либо спросить юзера что делать?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сравнить два DataSet'a ? / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]