当我执行以下代码时,我得到了一个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(),我就不会得到异常。
异常堆栈跟踪显示异常在这里抛出:
在d中的Dapper.SqlMapper.d__11`1.MoveNext():\Dev\Dapper-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
UPDATE:如果我在Management中执行查询,将插入行,但是返回的scope_identity为null。
发布于 2015-09-25 05:33:05
Scope_identity不会在远程/链接服务器上工作。有关解决方案,请参见以下答案: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将返回一个IEnumerable,从1.28开始有一个ExecuteScalar方法。
如果这对你有帮助的话,记得把答案投在链接中。
发布于 2015-09-25 07:55:27
您可以使用dapper和Management获得异常,这是因为两者在相同的范围内。当您使用SELECT SCOPE_IDENTITY()时,有两个语句在相同的作用域中,因此您总是得到NullReferenceException
如果您用分号分隔SQL语句,那么它应该可以工作。
var insertTransaction = @"INSERT INTO [192.168.1.55].databaseName.dbo.tableName
(Date, Desc)
VALUES(GETDATE(),
@Description);
SELECT Scope_identity()";发布于 2019-04-22 18:53:44
您可能会得到一个NullReferenceException,以防连接字符串为空或空.
这种情况发生在我身上,因为在等待调用之后,连接字符串在我重用等待之前使用的相同连接之前被清除。因此,在本例中,我必须在需要查询数据库的地方创建另一个连接。
https://stackoverflow.com/questions/32774993
复制相似问题