Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Ошибка когда вызываю метод Update


Автор: LectorSP 3.8.2007, 14:55
Может кто подскажет в чем дело....если в DataSet есть строки помеченные как Delete при вызове метода Updete пишет вот так 

Update requires a valid DeleteCommand when passed DataRow collection with deleted rows.

при добавлении строк все нормально...?

Код

public void RemoveServersGroup(string groupName)
        {
            AddTableInDataSet("serversgroups");

            foreach (DataRow row in dataSet.Tables["serversgroups"].Rows)
            {
                if(row["groupname"].ToString() == groupName)
                {
                    row.Delete(); 
                }
            }
            sqlDataAdapter.Update(dataSet, "serversgroups");  
        }


Добавлено через 5 минут и 26 секунд
после того как добавил SqlCommandBuilder пишет вот что....

Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not return any key column information.

Автор: Voyager 3.8.2007, 17:45
Возможно нужно создавать sqlDataAdapter с автогенерацией команд ("select...", true). А строки из таблицы я обычно удаляю через Remove().

Автор: mr.DUDA 5.8.2007, 10:45
Цитата(LectorSP @  3.8.2007,  14:55 Найти цитируемый пост)
Dynamic SQL generation for the DeleteCommand is not supported against a SelectCommand that does not return any key column information.

Либо в датасете нет Primary Key, либо команда Select не возвращает колонки с primary key.

Автор: LectorSP 5.8.2007, 23:53
и что делать...таблица, которая загоняеться в ДатаСет не с какой другой не связана...и что значит "команда Select не возвращает колонки с primary key"  поясните пожалуйста ?  


Автор: mihryak 6.8.2007, 00:33
Цитата(mr.DUDA @  5.8.2007,  11:45 Найти цитируемый пост)
Либо в датасете нет Primary Key

это значит, что ни одна колонка не помечена в датасете как первичный ключ
Цитата(LectorSP @  6.8.2007,  00:53 Найти цитируемый пост)
команда Select не возвращает колонки с primary key

а это - что команда SELECT, сгенерированная автоматически или заданная руками, не содержит в списке возвращаемых колонок колонку с первичным ключом

приведи структуру таблицы в базе, структуру таблицы в датасете  и запросы SELECT и DELETE, которые сконфигурил SqlCommandBuilder

Автор: LectorSP 6.8.2007, 09:53
Таблица очень простая ни с какими другими таблицами она не связана...две колонки...колонки с первичным ключем нету....запрос самый обычный.....SELECT * FROM tableName.....таблица в датасете, я как понимаю...точно такая же...а запрос DELETE, почему то пустой, в отличие от SELECT....периодически в дадасет добовляються еще пару таблиц...через SELECT * From tableName....вроде ничего сложного....только всё добавляеться, изменяется, но не удаляется...: ))

Автор: mihryak 6.8.2007, 13:31
задай тогда команду DELETE руками -
DELETE FROM tableName WHERE myField = 100
(точный синтаксис зависит от базы и типа колонки)

Автор: LectorSP 6.8.2007, 16:03
Точно, когда явно указал, что нужно делать, то все заработало...но почему так...и всегда ли надо прописывать DeleteCommand?

Автор: mihryak 6.8.2007, 16:53
надо всегда, но иногда не обязательно smile
всё дело в том, что SqlCommandBuilder генерирует команды как умеет, почти ничего не зная о структуре БД и о требованиях программиста, в большинстве случаев у него это получается неважно, а иногда, как в данном случае, - вообще не выходит. MS вроде как даже не рекомендует его использование в реальных приложениях.
Если нужен полный контроль над выполняемыми запросами - лучше все sql-команды прописать руками.

Автор: LectorSP 7.8.2007, 09:22
я всё понял...но у меня ещё один вопрос...строки он у меня удаляет без проблем..но почему то  постоянно выдаёт вот это

Concurrency violation: the DeleteCommand affected 0 of the expected 1 records. 

что это может быть такое...?

Автор: mihryak 7.8.2007, 18:45
Полагаю, дело в первичном ключе.
Цитата(MSDN)

DeleteCommand

Deletes rows at the data source for all rows in the table with a RowState of Deleted. Deletes all rows where the column values match the primary key column values of the row, and where the remaining columns at the data source match the original values of the row.

По этой же причине (отсутствие этого ключа) SqlCommandBuilder не может нормально сгенерировать DELETE-команду.
Если использование primary key неприемлимо и проблема не решится иным способом - придётся выдумывать какой-нибудь workaround smile Например - получать изменившиеся строки методом GetChanges() каждую удалённую удалять, добавленную добавлять, изменённую изменять smile Вполне можно написать собственный аналог DataAdapter, много времени не потребуется.

Автор: LectorSP 10.8.2007, 16:47
очень интересно, надо будет подумать над этим....
но пока что всё работает через try{}catch(){}  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)