2015-09-25 161 views
1

我得到一个NullReferenceException当我执行这段代码:如果我删除SELECT Scope_identity()我没有得到的异常小巧玲珑的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

一个实例。

的异常堆栈跟踪说,除了在这里抛出:

在Dapper.SqlMapper.d__11`1.MoveNext()在d:\开发\短小精悍点网\小巧玲珑NET40 \ SqlMapper。 CS:行1583

  1. 为什么SELECT Scope_identity()创建一个空的对象,我怎么能解决这个问题?
  2. 为什么堆栈跟踪显示我的本地计算机上不存在的文件路径?

UPDATE: 小巧玲珑的版本= 1.40.0.0,运行时版本= v4.0.30319 DLL = C:\ SRC \包\ Dapper.1.40 \ LIB \ net45 \ Dapper.dll

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

+0

@down选民,护理评论? –

+0

你能告诉我们你的精巧源的1583行吗?我只是尝试完全相同的查询,它为我工作。你在最新的Dapper版本上? – Rob

+0

您是否使用'.Query '取得更好的运气? (这显然是'Scope_identity'返回到Dapper后,在调试了一下之后) – Rob

回答

4

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()给人以小数不是一个int值。 和Dapper.SqlMapper.Query将返回IEnumerable,从1.28开始有ExecuteScalar方法。

请记住,如果这对您有帮助,请在链接中填写答案。

+1

尽管此链接可能会回答问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 –

+0

@LitisqeKumar同意,thx。一旦我在电脑上,而不是我的手机,会这样做。不幸的是, –

0

您使用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()"; 
+0

无法正常工作 –