我在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; }
}
}
答案 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扩展程序。