Вставка SQLite из Datatable - PullRequest
       4

Вставка SQLite из Datatable

2 голосов
/ 15 апреля 2019

Используя приведенное ниже, я получаю исключение с @table частью запроса. Можете ли вы использовать таблицы данных для вставки в SQLite таким образом?

 DataTable table = new DataTable();
 table.Columns.Add("Path", typeof(string));
 table.Columns.Add("StopName", typeof(string));
 table.Columns.Add("Latitude", typeof(string));
 table.Columns.Add("Longitude", typeof(string));

 foreach (Result result in tempResults)
 {
      table.Rows.Add(result.Path, result.StopName, result.Latitude, result.Longitude);
 }

 SQLiteCommand command = new SQLiteCommand("INSERT OR REPLACE INTO ZZ_DBA_Stop (Path, StopName, Latitude, Longitude) SELECT Path, StopName, Latitude, Longitude FROM @table", connection) { CommandTimeout = 3600, CommandType = CommandType.Text };
 command.Parameters.AddWithValue("@table", table);
 await command.ExecuteNonQueryAsync();

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

К сожалению, параметры не могут использоваться для выражения имен таблиц или столбцов.Вы можете использовать их только для выражения значений в операторе WHERE или в операции UPDATE / INSERT / DELETE.

Поэтому вы должны вставлять свои записи одну за другой или писать код для поддержки пакетных обновлений, как описано в этом вопросе

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

Этот пример сделан с использованием Dapper

NuGet
Сайт проекта

using(SQLiteConnection connection = GetOpenedConnection())
{
    string cmdText = @"INSERT OR REPLACE INTO ZZ_DBA_Stop 
                      (Path, StopName, Latitude, Longitude) 
                      VALUES(@Path, @StopName, @Latitude, @Longitude) ";
    connection.ExecuteAsync(cmdText, tempResults);
}

Dapper - это простой ORMэто расширяет функциональность IDbConnection.Он знает, как обрабатывать ваши модели, а также сохранять и извлекать их из базы данных.
В приведенном выше примере вы передаете весь список в качестве второго параметра в ExecuteAsync, и Dapper вставит для вас данные из всего списка.Единственное требование здесь состоит в том, чтобы свойства вашей модели имели одинаковые имена полей

GetOpenedConnection - это просто заполнитель для метода, который возвращает уже открытый SQLiteConnection.Вы можете заменить его кодом, необходимым для создания соединения, и добавить вызов для открытия перед вызовом ExecuteAsync

0 голосов
/ 15 апреля 2019

Вы не можете передать DataTable в качестве параметра.Я думаю, что основная причина, по которой вы хотите использовать DataTable в качестве параметра, заключается в том, что вы хотите выполнить массовую вставку в sqlite.Это пример

using (var transaction = connection.BeginTransaction())
using (var command = connection.CreateCommand())
{
    command.CommandText =
        "INSERT INTO contact(name, email) " +
        "VALUES($name, $email);";

    var nameParameter = command.CreateParameter();
    nameParameter.ParameterName = "$name";
    command.Parameters.Add(nameParameter);

    var emailParameter = command.CreateParameter();
    emailParameter.ParameterName = "$email";
    command.Parameters.Add(emailParameter);

    foreach (var contact in contacts)
    {
        nameParameter.Value = contact.Name ?? DBNull.Value;
        emailParameter.Value = contact.Email ?? DBNull.Value;
        command.ExecuteNonQuery();
    }

    transaction.Commit();
}

Ссылка: Массовая вставка в Microsoft.Data.Sqlite

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...