Отсутствует метод вставки адаптера таблицы C #

Я использую мастер C # VS2010 TableAdapter для своего проекта для взаимодействия с моей db. Я создал свои собственные команды Insert, Update и Delete для этого адаптера, поскольку он использует соединение и не может создавать свои собственные. Я согласен с этим, но, к сожалению, когда я создал команду Insert, я не смог вызвать метод Insert () в адаптере таблицы. Остальные методы работают нормально.

Например,

`this.joinTableAdapter = новый MyTableAdapter ();

this.joinTableAdapter.Insert () ‹- не существует.

Насколько я понимаю, как только вы создадите допустимую команду вставки, этот метод должен стать видимым в адаптере таблицы. Я ошибаюсь в этом? Он работает для моей команды обновления и удаления. Есть идеи, что я делаю неправильно?

Любая помощь приветствуется. Всем спасибо!


person ImGreg    schedule 19.01.2012    source источник
comment
Я предполагаю, что Insert () - статический метод. Я почему-то не могу найти DataTable в документации msdn.   -  person Security Hound    schedule 19.01.2012
comment
Я использую DataSets для своего проекта. В нем упоминается метод .Update () из адаптера таблицы, но ничего не упоминается о .Insert (). Странный..   -  person ImGreg    schedule 19.01.2012


Ответы (3)


TableAdapter GenerateDbDirectMethods

В дополнение к InsertCommand, UpdateCommand и DeleteCommand создаются адаптеры таблиц с методами, которые могут выполняться непосредственно в базе данных. Эти методы (TableAdapter.Insert, TableAdapter.Update и TableAdapter.Delete) можно вызывать напрямую для управления данными в базе данных.

Если вы не хотите создавать эти прямые методы, установите для свойства GenerateDbDirectMethods TableAdapter значение false (в окне «Свойства»). Дополнительные запросы, добавленные в TableAdapter, являются автономными запросами - они не генерируют эти методы.

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

Примечание. Это не то же самое, если щелкнуть Дополнительные параметры и щелкнуть:

Создание операторов вставки, обновления и удаления

При выборе этого параметра мастер попытается сгенерировать операторы INSERT, UPDATE и DELETE на основе оператора SELECT, определенного на странице «Создание операторов SQL».


Изменить:

TableAdapter не может автоматически создавать операторы вставки, обновления и удаления, если в основном запросе выбора задействовано несколько таблиц. Есть несколько подходов, если вам нужен один или несколько столбцов связанных таблиц, лучший способ зависит от ваших требований.

  1. Добавляйте запросы вставки, обновления и удаления вручную в адаптер таблицы. Эти методы можно вызывать непосредственно из экземпляра TableAdapter (например, InsertUser(param1,param2))
  2. Добавляйте команды вставки, обновления и удаления вручную в адаптер таблицы (конструктор или программно). Эти команды будут запускаться неявно из TableAdapter, когда вы вызываете Update. RowState в DataRow определяет, какая команда будет запущена. (например, Добавлено-> InsertCommand).
  3. Выберите одну таблицу и объедините таблицы через отношения с другими таблицами в DataSet.

Для третьего подхода вы можете использовать LINQ-To-DataSet, чтобы присоединиться к связанные таблицы, чтобы получить все необходимые столбцы (например, для создания источника данных для GridView).

person Tim Schmelter    schedule 19.01.2012
comment
Привет, Тим, спасибо за быстрый ответ. Я не могу использовать GenerateDbDirectMethods, так как у меня есть внутреннее соединение в моем операторе выбора, для этого он не сработает. Я уже проходил по обеим ссылкам ранее, и они, похоже, не объясняют, почему у меня возникла эта проблема. Я вручную добавил этот запрос вставки, но он как будто не распознает, что в tableadapter есть эта команда. - person ImGreg; 19.01.2012
comment
TableAdapter не может создавать операторы вставки, обновления и удаления, если в основном запросе выбора задействовано более таблиц. Вам нужно вручную добавить соответствующие запросы в TableAdapter или выбрать только одну таблицу и присоединиться к таблицам через отношения в DataSet. - person Tim Schmelter; 19.01.2012
comment
Я не хочу, чтобы он создавал их за меня! Я вручную создал команду вставки для адаптера таблицы. Однако, когда я действительно пытаюсь вызвать Insert из адаптера таблицы, его не существует! Уууууууууууууууууууууууу! Мой tableadapter.Update () отлично работает, и я сделал это точно так же. Грустная панда :(. - person ImGreg; 19.01.2012
comment
@ImGreg: я думаю, вы смешиваете добавление запроса к TableAdapter (что я имел в виду) и установку InsertCommand (что вы имели в виду). Первый может быть вызван в TableAdapter программно (например, вы добавляете метод InsertUser(param1,param2,...)). Последний будет вызываться неявно, если вы вызовете TableAdapter.Update(DataTable) или TableAdapter.Update(DataRow) в соответствии с текущим RowState каждого DataRow. - person Tim Schmelter; 19.01.2012
comment
Ааа, понятно. Вы правы, я имею в виду InsertCommand. Именно так я делал свое Обновление, и в идеале я бы хотел, чтобы Вставка была такой же, если это возможно. Есть идеи, почему мой способ не работает? Другой способ работы сильно усложняет мою программу. (т.е. отправка запроса 30 правильно преобразованных строк данных по сравнению с отправкой ему набора данных) - person ImGreg; 19.01.2012
comment
Вы видели, что я отредактировал ответ, чтобы предоставить больше информации? Итак, вы хотите использовать InsertCommand. Как я уже сказал, это мы неявно вызываем Updating DataTable / DataRow с помощью TableAdapter. Вы проверили, вставляет ли TableAdapter.Update также новые строки, если вы добавили их в DataTable? - person Tim Schmelter; 19.01.2012
comment
Извините, я пропустил правку в вашем ответе. Я еще не тестировал это, но это дает больше смысла в том, что происходит. Метод обновления фактически использует метод вставки на основе состояния строки. Попался. Я возьму его здесь. Спасибо, @Tim_Schmelter! - person ImGreg; 19.01.2012

Есть 4-й способ работы с запросами JOIN.

Для основного запроса адаптера таблицы опустите соединение. Затем добавьте вручную столбцы в таблицу данных и установите для их SourceColumn точное написание полей, которые вы добавите. Наконец, добавьте новый запрос к адаптеру таблицы, который включает соединение, и вызовите этот запрос, чтобы заполнить таблицы данных в вашем приложении.

Если это слишком сокращенно, дайте мне знать. Я уточню подробнее.

person jjthebig1    schedule 20.08.2015

Зайдите в набор данных, нажмите на tableadaptor и проверьте настройку свойства "GenerateDBDirectMethods" - должно быть истинным.

person Chris    schedule 25.05.2017