Desintrinski Ответов: 1

Добавьте insertcommand в dataadapter с помощью sqlitecommandbuilder


Я пытаюсь сгенерировать InsertCommand для SqliteDataAdapter, но получил эту ошибку:

Unhandled Exception:

System.InvalidOperationException: Dynamic SQL generation is not supported against a SelectCommand that does not return any base table information.


Что я уже пробовал:

using Mono.Data.Sqlite; 

public void Test(){
  var dataAdapter = new SqliteDataAdapter();
  var dataSet = new DataSet("TestTable");

  SqliteCommandBuilder commandBuilder = new SqliteCommandBuilder(dataAdapter);

  SqliteConnection connection = new SqliteConnection();
  connection.ConnectionString = "Data Source=" + dbPath;
  connection.Open();

  dataAdapter.SelectCommand = connection.CreateCommand();
  //dataAdapter.SelectCommand.CommandText = "SELECT * FROM TestTable";
  dataAdapter.SelectCommand.CommandText = "SELECT [ID], [Name] FROM TestTable";

  dataAdapter.InsertCommand = commandBuilder.GetInsertCommand(); // ERROR
}


Создать скрипт таблицы:

CREATE TABLE `TestTable` (
    `ID`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    `Name`  TEXT NOT NULL
);


Данные в таблице

1  'Pedro'


Кто-нибудь может помочь?

ZurdoDev

Это означает, что он не поддерживается. Разбейте свой sql на различные вызовы.

Desintrinski

Вы имеете в виду создать вручную команду обновления, удаления и вставки?

ZurdoDev

Да, сначала используйте обычный объект SqlCommand для создания таблицы.

Desintrinski

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

ZurdoDev

Ошибка говорит вам, что он не поддерживается в DataAdapters.

IndianaRags

То, что у вас есть, правильно, только в неправильной последовательности. Адаптер должен иметь SelectCommand, прежде чем можно будет создать CommandBuilder. Переместите строку CommandBuilder после команды SelectCommand, и она будет работать.

Desintrinski

Спасибо за ответ, но это не сработало, получил ту же ошибку.

1 Ответов

Рейтинг:
1

Maciej Los

Я не уверен, что это подходит для вас. SQLiteCommandBuilder, но MSDN утверждает:

Цитата:
То DbCommandBuilder необходимо выполнить следующие действия: SelectCommand для того чтобы вернуть метаданные, необходимые для построения INSERT, UPDATE, и DELETE Команды SQL. В результате возникает необходимость в дополнительном обращении к источнику данных, что может привести к снижению производительности. Чтобы достичь оптимальной производительности, указывайте свои команды явно, а не с помощью DbCommandBuilder.

Может быть... SQLiteCommandBuilder необходимо успешно получить данные в первую очередь (с помощью SelectCommand) уметь создавать правильные InsertCommand.

Я бы рекомендовал следовать совету, предоставленному Зурдодев[^]:
Цитата:
Да, сначала используйте обычный объект SqlCommand для создания таблицы.


Для получения более подробной информации, пожалуйста, смотрите: Начало работы с SQLite в C# – блог Тиграна[^]