Для обновления требуется допустимая команда UpdateCommand при передаче коллекции DataRow с измененными строками - PullRequest
14 голосов
/ 26 февраля 2009

Итак, у меня была эта работа на прошлой неделе. По крайней мере, я так и думал! Обновление DataGridView

Тогда я снова начинаю работать над проектом сегодня и получаю

Для обновления требуется допустимая команда UpdateCommand при передаче коллекции DataRow с измененными рядами.

Вкл.

scDB.SSIS_Configurations_StagingDataTable table = (scDB.SSIS_Configurations_StagingDataTable)stagingGrid.DataSource;
myStagingTableAdapter.Update(table);

У StagingTableAdapter есть дополнительный запрос, который принимает в качестве параметра фильтр. Это было использовано для заполнения DataGridView. В мастере для создания этого запроса я вижу «обновление было сгенерировано». Я вижу, что большинство сообщений с этой ошибкой требуют, чтобы оператор обновления создавался с помощью компоновщика команд. Что я делаю?

Ответы [ 10 ]

18 голосов
/ 13 июня 2011

Это сообщение также будет отображаться, если у вас нет первичного ключа, определенного в обновляемой таблице.

13 голосов
/ 31 июля 2009

Я столкнулся с той же проблемой, что и Сэм. У меня был рабочий код, который внезапно перестал работать. Я не знал, когда я это написал, но, должно быть, оно автоматически выводило команду обновления, а затем прекратило это делать. Возможно, пакет обновлений от MS между версиями, которые мы никогда не замечали. В любом случае, решение, с которым я столкнулся, заключается в использовании (в моем случае для Oracle) OracleCommandBuilder, который принимает DataAdapter (после вызова fill) в качестве параметра для конструктора, а затем вызывает GetUpdateCommand () и назначает его UpdateCommand в DataAdapter.

pseudocode:

DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new OracleCommandBuilder(da).GetUpdateCommand();
...
da.Update();
6 голосов
/ 15 мая 2011

Обходной путь Дэна работает для меня, но вместо OracleCommandBuilder я могу просто использовать SqlCommandBuilder:

DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand();
...
da.Update();
6 голосов
/ 26 февраля 2009

Ошибка довольно буквальная: для адаптера требуется допустимый оператор SQL Update. Разработчики наборов данных и CommandBuilders сгенерируют их для вас, но нет ничего плохого и в том, чтобы вручную создавать немного SQL.

В любом случае, вам придется проверить (отладчик), что оператор Update все еще настроен и чем он является на самом деле. Это может быть больше SQL, чем проблема C #.

Редактировать: инструменты Command Builder будут обрабатывать только прямую, единственную таблицу, операторы Select. Используйте Присоединение или что-нибудь необычное, и вы по своему усмотрению.

1 голос
/ 20 декабря 2016

У вас всегда должно быть поле столбца, определяемое первичным ключом. В противном случае проблема всегда будет существовать. SqlCommandBuilder не поможет вам, если у вас нет поля первичного ключа.

1 голос
/ 02 июня 2014

Я только что столкнулся с той же проблемой, и ответ Джейсона сработал для меня: я забыл назначить первичный ключ для моей таблицы.

Просто еще одно напоминание, которое нужно добавить: После устранения проблемы в таблице при возвращении в Visual Studio в файле .xsd, содержащем набор данных, обязательно удалите исходную таблицу и добавьте ее снова с сервера Explorer или Database Explorer. В противном случае ошибка все еще будет существовать.

0 голосов
/ 11 февраля 2019

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

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

Восстановите все, воссоздайте новый DataSet, замените DataGridView, используя перетаскивание , как и раньше, и все готово.

Как обычно, ответ прост, когда вы его знаете - невероятно расстраивает, когда вы этого не делаете.

Источник .

0 голосов
/ 31 августа 2018

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

Для обновления требуется действительная команда UpdateCommand при передаче коллекции DataRow с измененными строками.

Затем я обнаружил, что вам также необходимо обновить адаптер таблицы (имеет смысл, когда вы об этом думаете!).

В то время как вы делаете это, возможно, стоит еще раз проверить, что у вас выбрана опция Создать операторы вставки, обновления и удаления (как показано ниже).

enter image description here

Затем просто щелкните по мастеру, последний экран должен подтвердить, что он создаст повтор кода, который требуется (теперь с первичным ключом):

enter image description here

0 голосов
/ 24 февраля 2015

Я тоже столкнулся с той же проблемой и получил следующее решение. Попробуй.

private void btnSave_Click(object sender, EventArgs e)
{
    ConnStr = "Data Source=FIN03;Initial Catalog=CmsTest;Integrated Security=True";
    cn = new SqlConnection(ConnStr);
    cn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    mytran = cn.BeginTransaction(IsolationLevel.Serializable );

    cmd.Transaction = mytran;
    try
    {

        scb = new SqlCommandBuilder(da);
        da.Update(ds, "tblworker");
        mytran.Commit ();
        MessageBox.Show("Data update successfully"); 

    }
    catch (Exception err)
    {

           mytran.Rollback();

            MessageBox.Show(err.Message.ToString());           
    }
}
0 голосов
/ 26 февраля 2009

со страницы:

Примечание. Если в основном запросе достаточно информации, Команды InsertCommand, UpdateCommand и DeleteCommand созданы по умолчанию при создании TableAdapter. Если TableAdapter's Основной запрос - это больше, чем одна инструкция SELECT таблицы, это возможно, дизайнер не сможет сгенерировать InsertCommand, UpdateCommand и DeleteCommand. Если эти команды не генерируются, вы можете получить сообщение об ошибке при выполнении TableAdapter.Update способ.

Итак, насколько я могу судить, эти утверждения должны были быть сгенерированы. Я использую одну таблицу.

...