Dapper NullReferenceException

Dapper NullReferenceException

我在执行这段代码时收到 NullReferenceException:

var insertTransaction = @"INSERT INTO [192.168.1.55].databaseName.dbo.tableName
(Date, Desc) 
VALUES(GETDATE(), 
@Description)
SELECT Scope_identity()";

var result = _sqlMapper.Query<int>(insertTransaction,
             new
             {                           
                 Description = "some description"
             });

其中 _sqlMapper 是 Dapper.SqlMapper

的实例

如果我删除 SELECT Scope_identity() 我不会得到异常。

异常堆栈跟踪表明异常在此处抛出:

at Dapper.SqlMapper.d__11`1.MoveNext() in d:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1583

  1. 为什么 SELECT Scope_identity() 创建一个空对象,我该如何修复它?
  2. 为什么堆栈跟踪显示的文件路径在我的本地计算机上不存在?

更新: Dapper 版本 = 1.40.0.0,运行时版本 = v4.0.30319 DLL = C:\src\packages\Dapper.1.40\lib\net45\Dapper.dll

更新: 如果我在 Management Studio 中执行查询,则会插入该行,但返回的 scope_identity 为空。

Scope_identity 无法在 remote/linked 服务器上运行。请参阅以下答案以获取解决方案:Best way to get identity of inserted row in Linked server?

我最喜欢的方法:

 SELECT *
 FROM OPENQUERY(server, '
     INSERT INTO database.schema.table (columns) VALUES (values);
     SELECT SCOPE_IDENTITY() AS ID');

另请注意,SCOPE_IDENTITY() 给出的是小数而不是整数。 Dapper.SqlMapper.Query 将 return 和 IEnumerable,自 1.28 以来有一个 ExecuteScalar 方法。

如果对您有帮助,记得在 link 中给答案点赞哦。

使用 dapper 和 Management Studio 会出现异常,因为它们都在同一范围内。 当你 SELECT SCOPE_IDENTITY() 时,有两个语句在同一范围内,因此你总是得到 NullReferenceException

如果用分号分隔 SQL 语句,它应该可以工作

var insertTransaction = @"INSERT INTO [192.168.1.55].databaseName.dbo.tableName
(Date, Desc) 
VALUES(GETDATE(), 
@Description);
SELECT Scope_identity()";

如果您的连接字符串为 null 或空,您可能会收到 NullReferenceException。

这件事发生在我身上,因为在 await 调用之后连接字符串被清除,然后我重新使用 await 之前使用的相同连接。所以在这种情况下,我必须在需要查询数据库的地方创建另一个连接。