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.