2015-09-25 59 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

無法正常工作 –