Dapper.Contrib + MS Access:错误-SQL语句结束后找到字符

时间:2018-06-24 13:13:45

标签: c# ms-access dapper dapper-contrib

我在Contrib软件包中使用了Dapper ORM。 SELECT查询工作正常,但是我的问题是当我尝试INSERT数据时。

Visual Studio 2017返回此消息:

  

SQL语句结束后找到的字符

使用Dapper(没有Dapper.Contrib)执行的基本查询工作正常。但是我需要从数据库中最后插入的ID。

在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;
    }
}

Class客户:

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 :(得分:2)

您正在使用Dapper.Contrib,数据库是MS Access。您的INSERT调用正在生成两个SQL查询。首先,如您所愿,插入记录。其次是在屏幕后面以获取新生成的ID。

因此,生成的查询看起来像这样:

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

这两个查询都是在单次往返中执行的。 MS Access不支持此功能。 MS Access无法识别分号后的字符,即SELECT @@IDENTITY";

请参考this链接。

  

Jet数据库引擎不支持批量执行多个语句或不使用输出参数,因此无法使用这两种技术中的任何一种来返回分配给插入的新Autonumber值行。

解决方案是分别执行这两个查询,或者不执行第二个查询;以不同的方式处理。但是,您正在使用Contrib,它会为您生成查询。因此,您可以在这里进行的操作非常少(您自己修改Contrib代码)。

坦率地说,我不知道解决方案。我从未使用过Dapper.Contrib。可能这是在较新版本中修复的。或者可能是Contrib不支持MS Access。我只是想向你解释这个问题。请参阅其他answer,该问题讨论了相同的问题,但使用了Dapper扩展程序。