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
- 为什么
SELECT Scope_identity()
创建一个空对象,我该如何修复它?
- 为什么堆栈跟踪显示的文件路径在我的本地计算机上不存在?
更新:
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 之前使用的相同连接。所以在这种情况下,我必须在需要查询数据库的地方创建另一个连接。
我在执行这段代码时收到 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
- 为什么
SELECT Scope_identity()
创建一个空对象,我该如何修复它? - 为什么堆栈跟踪显示的文件路径在我的本地计算机上不存在?
更新: 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 之前使用的相同连接。所以在这种情况下,我必须在需要查询数据库的地方创建另一个连接。