Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Удаление строки из DataSet и обновление БД Access / 17 сообщений из 17, страница 1 из 1
04.08.2006, 12:47
    #33899546
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Имеется БД Access, 2 таблицы: Nacladnye и Goods.
Загружаем их в DataSet:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
		
private void Form1_Load(object sender, System.EventArgs e)
{
	try
	{
		daGoods.Fill(ds.Tables["Goods"]);
		daNacladnye.Fill(ds.Tables["Nacladnye"]);
	}
	catch(Exception ex)
	{
		MessageBox.Show(ex.Message);
		return;
	}

	DataRelation rel1 = new DataRelation("DataRelation1", ds.Tables["Nacladnye"].Columns["idNacl"], ds.Tables["Goods"].Columns["idNacl"]);
	// Add the relation to the DataSet.
	ds.Relations.Add(rel1);
}


Из таблицы ds.Tables["Nacladnye"] выводим строки в ListView. Удаляем строку из таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private void but_Del_Click(object sender, System.EventArgs e)
{
	ListViewItem lvi = listView1.SelectedItems[ 0 ];
	try
	{
		DataRowCollection rc = ds.Tables["Nacladnye"].Rows;
		rc[lvi.Index].Delete();
		ds.Tables["Nacladnye"].AcceptChanges();
	}
	catch(Exception ex)
	{
		MessageBox.Show(ex.Message.ToString());
	}
	udateListView();
}
Выполняем обновление БД:
Код: plaintext
1.
2.
3.
4.
5.
6.
private void but_Update_Click(object sender, System.EventArgs e)
{
	daNacladnye.Update(ds,"Nacladnye");
	daGoods.Update(ds,"Goods");
	udateListView();
}
при этом удаляются все дочерние строки из Goods, но удаляемая строка из Nacladnye остается в БД.
В локальном DataSet ее нет.
Вопрос: как сделать так, чтобы строка из Nacladnye удалялась из БД.

команды удаления/обновления в DataAdapter'е:
Код: plaintext
1.
2.
oleDbDeleteCommand1.CommandText = "DELETE FROM Nacladnye WHERE (idNacl = ?) AND (Caption = ? OR ? IS NULL AND Caption IS NULL)";
oleDbUpdateCommand1.CommandText = "UPDATE Nacladnye SET Caption = ? WHERE (idNacl = ?) AND (Caption = ? OR ? IS NULL AND Caption IS NULL)";
созданы автоматически

Спасибо.
...
Рейтинг: 0 / 0
04.08.2006, 14:52
    #33900010
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
может сначала удалить из дочерней таблицы, а потом из основной?

Код: plaintext
1.
2.
3.
4.
5.
6.
private void but_Update_Click(object sender, System.EventArgs e)
{
	
	daGoods.Update(ds,"Goods");
        daNacladnye.Update(ds,"Nacladnye");
	udateListView();
}
...
Рейтинг: 0 / 0
04.08.2006, 17:05
    #33900476
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
HandKotможет сначала удалить из дочерней таблицы, а потом из основной?

Нет, так не выдет.
Update используется для обновления (а не только для удаления). При вставке новых строк из БД получаем автоинкремент и изменяем (каскадно) через DataRelation значение idNacl в дочерней таблице:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private void daNacladnye_RowUpdated(object sender, System.Data.OleDb.OleDbRowUpdatedEventArgs args)
{
	// Include a variable and a command to retrieve the identity value from the Access database.
	int newID =  0 ;
	OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", oleDbConnection1);
	if (args.StatementType == StatementType.Insert)
	{
		// Retrieve the identity value and store it in the ID column.
		newID = (int) idCMD.ExecuteScalar();
		args.Row["idNacl"] = newID;
	}
Поэтому важно сперва выполнять обновление в родительской таблице.
...
Рейтинг: 0 / 0
04.08.2006, 19:58
    #33900901
Luter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Глянь в адаптерах для каждой таблицы команду на удаление строки? Может в адаптере род-й таблицы отсутствует таковая.
...
Рейтинг: 0 / 0
05.08.2006, 15:59
    #33901344
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
LuterГлянь в адаптерах для каждой таблицы команду на удаление строки? Может в адаптере род-й таблицы отсутствует таковая.

Она присутствует не только в адаптере но и в моем первом посте
...
Рейтинг: 0 / 0
07.08.2006, 09:31
    #33902225
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
вот мой кусок кода

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        Dim aRowsToUpdate As DataRow()
        Dim dvrs As DataViewRowState

        If dsRT.HasChanges Then
            Try
                'перадаем новые или измененные 
                dvrs = DataViewRowState.Added Or DataViewRowState.ModifiedCurrent
                aRowsToUpdate = ds.Table1.Select("", "", dvrs)
                sda1.Update(aRowsToUpdate)

                'передаем все изменения таблицы параметров
                sda2.Update(ds.Table2)

                'передаем удаленные отчеты
                dvrs = DataViewRowState.Deleted
                aRowsToUpdate = ds.Table1.Select("", "", dvrs)
                sdaReportType.Update(aRowsToUpdate)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Ошибка обновления", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If

здесь тоже участвуют 2 таблицы Table1 - главная, table2 - подчиненная связь "1-многое"
...
Рейтинг: 0 / 0
05.11.2006, 22:15
    #34106551
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Создал простую БД с одной таблицей. В локальном dataset'е удаляю запись, но в самой БД после выполнения Update строки остаются. Новые записи и измененные передаются без проблем. Почему не удаляются записи из Access?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
			// oleDbDeleteCommand1
			// 
			this.oleDbDeleteCommand1.CommandText = "DELETE FROM Goods WHERE (idNum = ?) 
AND (Col = ? OR ? IS NULL AND Col IS NULL) AND (Naim = ? OR ? IS NULL AND Naim IS NULL)";
			this.oleDbDeleteCommand1.Connection = this.oleDbConnection1;
			this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_idNum",
 System.Data.OleDb.OleDbType.Integer,  0 , System.Data.ParameterDirection.Input, false, ((System.Byte)( 0 )), ((System.Byte)( 0 )),
 "idNum", System.Data.DataRowVersion.Original, null));
			this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_Col",
 System.Data.OleDb.OleDbType.Integer,  0 , System.Data.ParameterDirection.Input, false, ((System.Byte)( 0 )), ((System.Byte)( 0 )), "Col", System.Data.DataRowVersion.Original, null));
			this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_Col1", 
System.Data.OleDb.OleDbType.Integer,  0 , System.Data.ParameterDirection.Input, false, ((System.Byte)( 0 )), ((System.Byte)( 0 )), "Col", System.Data.DataRowVersion.Original, null));
			this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_Naim", System.Data.OleDb.OleDbType.VarWChar,  50 , System.Data.ParameterDirection.Input, false,
 ((System.Byte)( 0 )), ((System.Byte)( 0 )), "Naim", System.Data.DataRowVersion.Original, null));
			this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_Naim1", System.Data.OleDb.OleDbType.VarWChar,  50 , System.Data.ParameterDirection.Input, false, 
((System.Byte)( 0 )), ((System.Byte)( 0 )), "Naim", System.Data.DataRowVersion.Original, null));
			
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
		private void btnUpdateBD_Click(object sender, System.EventArgs e)
		{
			da.Update(ds,"Goods");
		}

		private void btnDelCur_Click(object sender, System.EventArgs e)
		{
			ListViewItem lvi = listView1.SelectedItems[ 0 ];
			try
			{
				ds.Tables["Goods"].Rows.RemoveAt(lvi.Index);
				ds.Tables["Goods"].AcceptChanges();
			}
			catch(Exception ex)
			{
				MessageBox.Show(ex.Message.ToString());
			}
...
Рейтинг: 0 / 0
06.11.2006, 12:58
    #34106982
Ramin Hashimzade
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
а воопшето зачем такой запрос?!
Код: plaintext
1.
DELETE FROM Goods WHERE (idNum = ?) 
AND (Col = ? OR ? IS NULL AND Col IS NULL) AND (Naim = ? OR ? IS NULL AND Naim IS NULL)
помоему какоето параметр не получает правильный значение!

а не просто ли писать так?!
Код: plaintext
DELETE FROM Goods WHERE (idNum = @id) 


----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
06.11.2006, 15:37
    #34107223
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
simply_sash
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void btnDelCur_Click(object sender, System.EventArgs e)
{
ListViewItem lvi = listView1.SelectedItems[0];
  try
  {
 ds.Tables["Goods"].Rows.RemoveAt(lvi.Index);
 ds.Tables["Goods"].AcceptChanges();
  }
  catch(Exception ex)
  {
  MessageBox.Show(ex.Message.ToString());
  }

а зачем вы удаляете записи из коллекции Rows?
Используйте метод Delete .

Код: plaintext
 uid  =  S a

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
07.11.2006, 15:15
    #34109334
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Raminа воопшето зачем такой запрос?!
Код: plaintext
1.
DELETE FROM Goods WHERE (idNum = ?) 
AND (Col = ? OR ? IS NULL AND Col IS NULL) AND (Naim = ? OR ? IS NULL AND Naim IS NULL)


Такой запрос создает Мастер при создании dataadapter'а.
...
Рейтинг: 0 / 0
07.11.2006, 16:07
    #34109556
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
simply_sash
Такой запрос создает Мастер при создании dataadapter'а.

по теме: http://www.sql.ru/forum/actualthread.aspx?tid=357466

в данном случае не в запросе дело



Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
09.11.2006, 21:54
    #34117644
Ramin Hashimzade
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
авторв данном случае не в запросе дело
именно в запросе!
он не удаляет из гоодс!

----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
11.11.2006, 15:06
    #34121222
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Всем спасибо за участие. Проблема решена. Методом научного тыка установлено, что не передаются удаленные строки из DataSet после вызова метода AcceptChanges(). Очевидно при передачи одновлений используется флаг DataRowState.Deleted, который после AcceptChanges() удаляется вместе со строкой и удаленные строки остаются в БД и после обновления. Поступаю так. Когда требуется передать обновления из локального DataSet в БД:
1. удаляю все удаленные (простите за тавтологию) строки из дочерней таблицы;
2. -//- из родительской таблицы;
3. вызываю AcceptChanges();
4. передаю обновления в родительскую таблицу;
5. передаю обновления в дочернюю таблицу.

2: Ramin.
"По умолчанию мастер Data Adapter Configuration Wizard добавляет в раздел WHERE запросов, передающих отложенные изменения и удаления, все столбцы, не содержащие BLOB-данных. Если снять флажок Use Optimistic Concurrency, мастер добавит в раздел WHERE таких запросов только поля первичного ключа.", стр. 379
(с) Дэвид Сеппа. Microsoft ADO.NET/Пер. с англ. — М.: Издательско-торговый дом «Русская Редакция», 2003- — 640 стр.: ил.
...
Рейтинг: 0 / 0
11.11.2006, 18:03
    #34121354
Ramin Hashimzade
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
обновление на каждую руку не крсиво!

----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
12.11.2006, 15:44
    #34121978
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Raminобновление на каждую руку не крсиво!

Это вы о чем?
...
Рейтинг: 0 / 0
13.11.2006, 06:25
    #34122585
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Ramin
именно в запросе!
он не удаляет из гоодс!

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

simply_sash
Всем спасибо за участие. Проблема решена. Методом научного тыка установлено, что не передаются удаленные строки из DataSet после вызова метода AcceptChanges(). Очевидно при передачи одновлений используется флаг DataRowState.Deleted, который после AcceptChanges() удаляется вместе со строкой и удаленные строки остаются в БД и после обновления.

лишнее в вашем коде не только AcceptChanges. см. мой первый пост
http://www.sql.ru/forum/actualthread.aspx?tid=322716#3359670

simply_sash
Поступаю так. Когда требуется передать обновления из локального DataSet в БД:
1. удаляю все удаленные (простите за тавтологию) строки из дочерней таблицы;
2. -//- из родительской таблицы;
3. вызываю AcceptChanges();
4. передаю обновления в родительскую таблицу;
5. передаю обновления в дочернюю таблицу.

изобретаете велосипед, master-detail проапдейтить можно подобным образом
/topic/82293#594225

но для этого нужно корректно удалять записи, а именно не удалять записи из коллекции DataRowCollection при помощи методов Remove и RemoveAt и лучше вообще забыть про использование этих методов.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
13.11.2006, 14:28
    #34123968
simply_sash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки из DataSet и обновление БД Access
Sa[quot Ramin]
но для этого нужно корректно удалять записи, а именно не удалять записи из коллекции DataRowCollection при помощи методов Remove и RemoveAt и лучше вообще забыть про использование этих методов.


Так я и использую Delete. Remove и RemoveAt я пробовал, когда не передавались удаленные записи в БД.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Удаление строки из DataSet и обновление БД Access / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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