Подтвердить что ты не робот

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

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

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

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

Вкл

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

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

4b9b3361

Ответ 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 не поможет вам, если у вас нет поля первичного ключа.