我想在多个表上运行多个insert语句.我正在使用dapper.net.我没有看到任何方法来处理与dapper.net的交易.
请分享您对如何使用dapper.net进行交易的想法.
所以我有一个以标识列为主键的表,所以它是一个整数.那么,为什么SCOPE_IDENTITY()总是向我的C#应用程序返回一个十进制值而不是一个int?这真的很烦人,因为十进制值不会隐式转换为C#中的整数,这意味着我现在必须重写一堆东西,并且有很多辅助方法,因为我使用SQL Server和Postgres,Postgres确实返回一个整数等效功能..
为什么SCOPE_IDENTITY()不只返回一个普通的整数?是否有人通常使用十进制/非身份值作为主键?
MSSQL在这里已经涵盖了这个问题:
但是这个解决方案不适用于mysql.
要LAST_INSERT_ID()使用mysql转换为整数,您必须这样做:
SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);
堆栈跟踪是:
Dapper.<QueryInternal>d__13`1.MoveNext() in sqlMapper.cs:607
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +159
System.Linq.Enumerable.ToList(IEnumerable`1 source) +36
Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in sqlMapper.cs:535
Run Code Online (Sandbox Code Playgroud)
有没有人在MySQL中解决这个问题?
编辑:
我已成功完成以下工作:
var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single();
Run Code Online (Sandbox Code Playgroud)
也许不理想,但它的确有效.
使用Dapper我想实现一个采用IEnumberable类型对象的方法User.现在,User看起来如下:
public class User
{
public int UserId { get; internal set; }
public DateTime DateCreated { get; internal set; }
public DateTime DateChanged { get; internal set; }
public string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这里的关键在于UserId,DateCreated和DateChanged永远不会通过对象进行设置,因此internal关键字.相反,数据库将填充这些值.
因为对象因此被修改为插入操作的一部分,所以我想返回另一个IEnumerable类型的对象,User但这次填充了相应的属性.
最近我意识到我可以让Dapper循环遍历下面的User对象IEnumerable:
public int Insert(IEnumerable<User> users)
{
string sql = string.Format("INSERT INTO [User] (Username) VALUES (@Username)");
return GetOpenConnection().Execute<User>(sql, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Dapper和将数据库Dapper-Extensions序列化为.enumsstring
现在,它们被序列化为整数(在VARCHAR字段内).
有没有办法做到这一点?我可以添加的任何自定义类型映射?
如果我不能通过它,我可能需要回到EF.
我正在尝试使用SCOPE_IDENTITY将长主键返回到c#,使用DynamicParameter的ReturnValue选项.
以下是Dapper网站的示例代码:
var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure);
int b = p.Get<int>("@b");
int c = p.Get<int>("@c");
Run Code Online (Sandbox Code Playgroud)
我宁愿做以下操作,而不是返回int,因为我的主键字段应该是bigint
var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int64, direction: ParameterDirection.ReturnValue);
cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure);
int b = p.Get<int>("@b");
int c = p.Get<long>("@c");
Run Code Online (Sandbox Code Playgroud)
在我的过程中,我正在使用"RETURN SCOPE_IDENTITY()".
但是,这样做似乎导致"指定演员表无效".例外.
当我使用 Dapper 插入、更新或删除实体时,我需要返回id实体的。
我正在使用这段代码:
var role = await roleConnection.ExecuteAsync("UPDATE Role SET IsDelete = @isDelete, RoleName = @roleName, SecurityStamp = @securityStamp WHERE Role.Id = @id SELECT SELECT CAST(SCOPE_IDENTITY() AS INT)"
, new
{
isDelete = request.IsDelete = false,
roleName = request.RoleName,
securityStamp = Guid.NewGuid(),
id = request.Id
});
Run Code Online (Sandbox Code Playgroud)
但它没有向我显示任何内容。
我怎样才能做到这一点?
我的存储库中有以下方法。到目前为止,我相信返回的int只是一个指示操作是否成功的int。我希望int是成功执行后返回的id(即表的单列)。我该如何完成?
public async Task<int> AddNewGroup()
{
using(_connection)
{
_connection.Open();
var id = await _connection.ExecuteAsync("INSERT INTO groups").Single();
}
}
Run Code Online (Sandbox Code Playgroud) dapper ×7
c# ×5
asp.net-core ×2
.net ×1
asp.net ×1
mysql ×1
primary-key ×1
sql ×1
sql-insert ×1
sql-server ×1
transactions ×1