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

Я использую 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 Ответ

0 голосов
/ 25 июня 2018

Вы используете 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.

...