Для обновления требуется действительный UpdateCommand при передаче коллекции DataRow с измененными строками
Итак, у меня была эта работа на прошлой неделе. По крайней мере, я думал, что сделал!
Обновление DataGridView
Затем я снова начинаю работу над проектом и получаю
"Для обновления требуется действительный UpdateCommand при передаче коллекции DataRow с измененными строками".
Вкл
scDB.SSIS_Configurations_StagingDataTable table = (scDB.SSIS_Configurations_StagingDataTable)stagingGrid.DataSource;
myStagingTableAdapter.Update(table);
У StagingTableAdapter есть дополнительный запрос, который принимает параметр "фильтр" в качестве параметра. Это было использовано для заполнения gridview. В мастере создания этого запроса я вижу, что "было создано обновление". Я вижу, что в большинстве сообщений с этой ошибкой требуется, чтобы оператор обновления был сгенерирован с помощью построителя команд. Что я делаю?
Ответы
Ответ 1
Ошибка довольно буквальна: для адаптера требуется действительная инструкция SQL Update. Разработчики Dataset и CommandBuilders будут генерировать их для вас, но нет ничего плохого в том, чтобы вручную создавать немного SQL.
В любом случае вам нужно будет проверить (отладчик), что оператор Update все еще настроен и что он на самом деле. Это может быть больше SQL, чем проблема с С#.
Изменить: инструменты Command Builder будут обрабатывать только прямые, одиночные таблицы, операторы Select. Используйте Присоединиться или что-нибудь интересное, и вы сами.
Ответ 2
Это сообщение также будет отображаться, если у вас нет первичного ключа, указанного в обновляемой таблице.
Ответ 3
Я столкнулся с той же проблемой, что и Сэм. У меня был рабочий код, который внезапно больше не работал. Я не знал, когда писал это, но должен был автоматически вывести команду update, а затем прекратил это делать. Возможно, пакет обновления от MS между версиями, которые мы никогда не замечали. Во всяком случае, решение, с которым я столкнулся, использует (в моем случае для oracle) OracleCommandBuilder, который берет DataAdapter (после вызова fill) в качестве параметра для конструктора, а затем вызывает GetUpdateCommand() и назначает это UpdateCommand в DataAdapter.
pseudocode:
DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new OracleCommandBuilder(da).GetUpdateCommand();
...
da.Update();
Ответ 4
Обходной путь Dan работает для меня, но вместо OracleCommandBuilder я могу просто использовать SqlCommandBuilder:
DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand();
...
da.Update();
Ответ 5
На странице:
Примечание. Если в основном запросе содержится информация, Команды InsertCommand, UpdateCommand и DeleteCommand по умолчанию при создании TableAdapter. Если TableAdapter's главный запрос - это больше, чем одна инструкция SELECT таблицы, это возможно, дизайнер не сможет создать InsertCommand, UpdateCommand и DeleteCommand. Если эти команды не сгенерированы, вы можете получить сообщение об ошибке при выполнении команды TableAdapter.Update Метод.
Итак, из того, что я могу сказать, эти утверждения должны были быть сгенерированы. Я использую одну таблицу.
Ответ 6
Я просто испытал ту же проблему, и ответ Джейсона работал у меня: я забыл назначить первичный ключ для моей таблицы.
Просто еще одно напоминание: после исправления проблемы в таблице при возврате в Visual Studio в файле .xsd, который содержит набор данных, обязательно удалите исходную таблицу и добавьте ее снова с сервера Explorer или Database Explorer. В противном случае ошибка все равно будет существовать.
Ответ 7
Я также столкнулся с той же проблемой и получил следующее решение. Попробуйте.
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());
}
}
Ответ 8
У вас всегда должно быть поле столбца с определенным ключом. В противном случае проблема всегда будет существовать. SqlCommandBuilder не поможет вам, если у вас нет поля первичного ключа.