如何对数据库执行插入并使用Dapper返回插入的标识?
我尝试过这样的事情:
string sql = "DECLARE @ID int; " +
"INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff); " +
"SELECT @ID = SCOPE_IDENTITY()";
var id = connection.Query<int>(sql, new { Stuff = mystuff}).First();
Run Code Online (Sandbox Code Playgroud)
但它没有用.
@Marc Gravell谢谢你的回复.我已经尝试过你的解决方案但是,下面仍有相同的异常跟踪
System.InvalidCastException: Specified cast is not valid
at Dapper.SqlMapper.<QueryInternal>d__a`1.MoveNext() in (snip)\Dapper\SqlMapper.cs:line 610
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in (snip)\Dapper\SqlMapper.cs:line 538
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param) in (snip)\Dapper\SqlMapper.cs:line 456
Run Code Online (Sandbox Code Playgroud) 我一直在玩Dapper,但我不确定处理数据库连接的最佳方法.
大多数示例显示在示例类中创建的连接对象,甚至在每个方法中.但是我觉得在每个clss中引用连接字符串都是错误的,即使它是从web.config中提取的.
我的经验是使用DbDataContext或DbContext使用Linq to SQL或Entity Framework,所以这对我来说是新的.
使用Dapper作为我的数据访问策略时,如何构建我的Web应用程序?
IDisposable的实现是否可以安全地多次调用Dispose()?或者相反?大多数.NET Framework类采用什么方法?
具体来说,System.Data.Linq.DataContext.Dispose()多次通话是否安全?
我问的原因是因为我想知道是否需要这种额外保护:
public override void Dispose(bool disposing)
{
// Extra protection...
if (this.obj != null)
{
this.obj.Dispose();
this.obj = null;
}
// Versus simply...
this.obj.Dispose();
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
在处理类的IDisposable成员时,或者我是否应该在this.obj.Dispose()不关心之前调用它的情况下调用它.
目前,我正在尝试使用Dapper ORM与工作单元+存储库模式.
我想使用工作单元而不是简单的dapper存储库,因为我的插入和更新需要一定程度的事务处理.我一直无法找到任何有用的例子,因为大多数似乎使用实体框架并且在工作单元内存在泄漏问题.
有人可以指点我正确的方向吗?
这是使用的正确方法是BeginTransaction()用IDbConnection在小巧玲珑的?
我创建了一个必须使用的方法BeginTransaction().这是代码.
using (IDbConnection cn = DBConnection)
{
var oTransaction = cn.BeginTransaction();
try
{
// SAVE BASIC CONSULT DETAIL
var oPara = new DynamicParameters();
oPara.Add("@PatientID", iPatientID, dbType: DbType.Int32);
..........blah......blah............
}
catch (Exception ex)
{
oTransaction.Rollback();
return new SaveResponse { Success = false, ResponseString = ex.Message };
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行上面的方法 - 我有一个例外 -
操作无效.连接已关闭.
这是因为在打开连接之前无法开始事务.所以当我添加这一行:时cn.Open();,错误得到解决.但我已经读过某个地方,手动打开连接是不好的做法!! Dapper仅在需要时才打开连接.
在Entity框架中,您可以使用a处理事务TransactionScope.
所以我的问题是cn.Open()...在没有在Dapper中添加行来处理事务的好习惯是什么?我想应该有一些正确的方法.
我刚刚开始使用Dapper,我想知道哪种交易模式会更好.
当我编写SQL时,我更喜欢使用脚本中已有的事务:
BEGIN TRAN
-- insert, update etc.
COMMIT
Run Code Online (Sandbox Code Playgroud)
因为它更容易测试它,但也有问题交易与dapper dot net 使用.net事务,所以现在我不确定我应该使用哪一个.
这两种方法都有不同的优势吗?
c# ×5
dapper ×5
.net ×3
idisposable ×1
orm ×1
sql-server ×1
t-sql ×1
transactions ×1
unit-of-work ×1