Dapper.Contrib + MS Access: ошибка - символы, найденные после окончания оператора SQL

Я использую Dapper ORM с пакетом Contrib. SELECT запрос работает отлично, но моя проблема, когда я пытаюсь INSERT данные.

Visual Studio 2017 возвращает это сообщение:

Символы, найденные после окончания оператора SQL

Базовый запрос, выполняемый с помощью Dapper (без Dapper.Contrib), работает нормально. Но мне нужен последний вставленный идентификатор из базы данных.

Код функции для вставки данных в базу данных MS Access 2007:

public string AddCustomer(string lastName, string firstName)
{
    using (var connection = new OleDbConnection(connectionString))
    {
        try
        {
            connection.Open();

            // Inserts data into the database.
            var insertion = connection.Insert(
                new Customer { Customer_lastName = LastNameManipulation(lastName), Customer_firstName = FirstNameManipulation(firstName) }
            );

            // Defines new customer.
            Customer customer = new Customer
            {
                Customer_id = Convert.ToInt32(insertion),
                Customer_lastName = LastNameManipulation(lastName),
                Customer_firstName = FirstNameManipulation(firstName)
            };

            // Insertion into data List.
            data.AddCustomer(customer);

            message = "Customer added with success.";
        }
        catch (Exception e)
        {
            message = e.Message.ToString();
        }
        finally
        {
            connection.Close();
        }

        return message;
    }
}

Класс Заказчик:

using System;
using Dapper.Contrib.Extensions;

namespace DataLibrary
{
    [Serializable]
    [Table("Customer")]
    public class Customer
    {
        [Key]
        [Computed]
        public int Customer_id { get; set; }

        [Write(true)]
        public string Customer_lastName { get; set; }

        [Write(true)]
        public string Customer_firstName { get; set; }
    }
}

1 ответ

Решение

Вы используете Dapper.Contrib и ваша база данных MS Access. Ваш вызов INSERT генерирует два SQL-запроса. Сначала, как вы ожидаете, вставьте запись. Второй находится за экраном, чтобы получить вновь сгенерированный идентификатор.

Итак, сгенерированные запросы выглядят примерно так:

INSERT INTO Table (......) VALUES (....);
SELECT @@IDENTITY";

Оба эти запроса выполняются в одном цикле. И это не поддерживается MS Access. MS Access не понимают символы после точки с запятой, т.е. SELECT @@IDENTITY";,

Пожалуйста, обратитесь по этой ссылке.

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

Решение состоит в том, чтобы выполнить эти два запроса отдельно ИЛИ не выполнять второй запрос; обращаться с этим по-другому. НО, вы используете Contrib, и он генерирует запрос для вас. Таким образом, вы можете сделать очень мало (измените код Contrib самостоятельно) здесь.

Честно говоря, я не знаю решения для этого. Я никогда не использовал Dapper.Contrib. Может быть, это исправлено в новой версии. Или может быть, что Contrib не поддерживает MS Access. Я просто пытался объяснить вам проблему. Пожалуйста, обратитесь к этому другому ответу, который обсуждает ту же проблему, но вместо этого с Dapper Extensions.

Другие вопросы по тегам