我正在C#中使用Dapper,后端是MS Access.我的DAL方法在数据库中插入记录.我想返回插入行的唯一标识符(或使用唯一标识符更新的POCO).
我期望我的功能如下(我知道这不起作用;只是为了解释我想要的):-
public MyPoco Insert(MyPoco myPoco)
{
sql = @"INSERT INTO MyTable (Field1, Field2) VALUES (@Field1, @Field2)";
var param = GetMappedParams(myPoco);//ID property here is null.
var result = _connection.Query<MyPoco>(sql, param, null, false, null, CommandType.Text);.Single();
return result;//This result now contains ID that is created by database.
}
我来自NHibernate世界,POCO随NH自动更新.如果不;我们可以调用Refresh方法并更新ID.
我不知道如何使用Dapper实现这一目标.
我在SO上阅读了this的问题,因为它谈论SQL Server,这是不相关的.
另一个this问题没有接受的答案.
我读了this问题,其中已接受的答案解释了使用@@ Identity的陷阱.
解决方法:
这对我有效:
static MyPoco Insert(MyPoco myPoco)
{
string sql = "INSERT INTO MyTable (Field1, Field2) VALUES (@Field1, @Field2)";
_connection.Execute(sql, new {myPoco.Field1, myPoco.Field2});
myPoco.ID = _connection.Query<int>("SELECT @@IDENTITY").Single();
return myPoco; // This result now contains ID that is created by database.
}
请注意,这将适用于Access数据库的OleDbConnection,但不适用于OdbcConnection.
重新编辑:评论
为了确保INSERT和SELECT调用之间的连接保持打开状态,我们可以这样做:
static void Insert(MyPoco myPoco)
{
string sql = "INSERT INTO MyTable (Field1, Field2) VALUES (@Field1, @Field2)";
bool connAlreadyOpen = (_connection.State == System.Data.ConnectionState.Open);
if (!connAlreadyOpen)
{
_connection.Open();
}
_connection.Execute(sql, new {myPoco.Field1, myPoco.Field2});
myPoco.ID = _connection.Query<int>("SELECT @@IDENTITY").Single();
if (!connAlreadyOpen)
{
_connection.Close();
}
return; // (myPoco now contains ID that is created by database.)
}
标签:dapper,c,ms-access 来源: https://codeday.me/bug/20191027/1941139.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。