powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Удаление строки из DataSet и обновление БД Access
17 сообщений из 17, страница 1 из 1
Удаление строки из DataSet и обновление БД Access
    #33899546
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется БД 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
Удаление строки из DataSet и обновление БД Access
    #33900010
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может сначала удалить из дочерней таблицы, а потом из основной?

Код: 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
Удаление строки из DataSet и обновление БД Access
    #33900476
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Удаление строки из DataSet и обновление БД Access
    #33900901
Luter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глянь в адаптерах для каждой таблицы команду на удаление строки? Может в адаптере род-й таблицы отсутствует таковая.
...
Рейтинг: 0 / 0
Удаление строки из DataSet и обновление БД Access
    #33901344
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LuterГлянь в адаптерах для каждой таблицы команду на удаление строки? Может в адаптере род-й таблицы отсутствует таковая.

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

Код: 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
Удаление строки из DataSet и обновление БД Access
    #34106551
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал простую БД с одной таблицей. В локальном 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
Удаление строки из DataSet и обновление БД Access
    #34106982
Фотография Ramin Hashimzade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а воопшето зачем такой запрос?!
Код: 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
Удаление строки из DataSet и обновление БД Access
    #34107223
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Удаление строки из DataSet и обновление БД Access
    #34109334
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Удаление строки из DataSet и обновление БД Access
    #34109556
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
simply_sash
Такой запрос создает Мастер при создании dataadapter'а.

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

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



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

----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
Удаление строки из DataSet и обновление БД Access
    #34121222
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за участие. Проблема решена. Методом научного тыка установлено, что не передаются удаленные строки из 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
Удаление строки из DataSet и обновление БД Access
    #34121354
Фотография Ramin Hashimzade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обновление на каждую руку не крсиво!

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

Это вы о чем?
...
Рейтинг: 0 / 0
Удаление строки из DataSet и обновление БД Access
    #34122585
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Удаление строки из DataSet и обновление БД Access
    #34123968
simply_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sa[quot Ramin]
но для этого нужно корректно удалять записи, а именно не удалять записи из коллекции DataRowCollection при помощи методов Remove и RemoveAt и лучше вообще забыть про использование этих методов.


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


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