c# - Dapper.Contrib + MS Access:错误 - 在 SQL 语句结束后发现的字符
问题描述
我将 Dapper ORM 与 Contrib 包一起使用。查询完美运行,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;
}
}
客户类:
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; }
}
}
解决方案
您正在使用 Dapper.Contrib 并且您的数据库是 MS Access。您的 INSERT 调用正在生成两个 SQL 查询。首先,如您所料,插入记录。其次是在屏幕后面获取新生成的 id。
因此,生成的查询看起来像这样:
INSERT INTO Table (......) VALUES (....);
SELECT @@IDENTITY";
这两个查询都在单次往返中执行。MS Access 不支持此功能。MS Access 不理解分号后的字符,即SELECT @@IDENTITY";
.
请参考此链接。
Jet 数据库引擎不支持在批处理中执行多个语句或使用输出参数,因此不可能使用这些技术中的任何一种来返回
Autonumber
分配给插入行的新值。
解决方案是分别执行这两个查询或不执行第二个查询;以不同的方式处理它。但是,您正在使用 Contrib,它会为您生成查询。因此,您可以在这里做的事情非常少(自己修改 Contrib 代码)。
坦率地说,我不知道解决方案。我从未使用过 Dapper.Contrib。可能这是在较新版本中修复的。或者可能是 Contrib 不支持 MS Access。我只是试图向你解释这个问题。请参考这个讨论相同问题但使用 Dapper Extensions 的其他答案。
推荐阅读
- java - 每次重启后都会添加片段(Android)
- postgresql - st_dwithin 忽略 Postgresql 要点索引
- async-await - 在下一个 js 中无限的异步函数执行
- linux - 如何在终端管道请求中从其名称的一部分获取和使用 docker 容器 ID?
- html - 如何根据离子内容的高度有条件地扩展元素?
- angular - Ionic Angular InAppBrowser 重定向帖子
- angular - Angular 单元测试失败:没有 WebSocketAPI 的提供者
- regex - PostgreSQL查询中字符串最后n个字符的正则表达式
- python - 使用“或”的两种方式之间的区别
- php - Ubuntu/PHP - WebSocket 服务器不接受多个连接