Sql-Server為什麼
為什麼SELECT @@IDENTITY
返回一個小數?
我正在使用Dapper從 ASP.NET MVC 3 (.NET 4.0) 應用程序對 SQL Server 2008 R2 Express 實例執行以下查詢。
INSERT INTO Customers ( Type, Name, Address, ContactName, ContactNumber, ContactEmail, Supplier) VALUES ( @Type, @Name, @Address, @ContactName, @ContactNumber, @ContactEmail, @Supplier) SELECT @@IDENTITY
呼叫
connection.Query<int>(sql, ...)
引發了無效的強制轉換異常。我已經對其進行了調試,它位於 Dapper 呼叫GetValue
返回的SqlDataReader
.的返回類型
GetValue
是Object
,在調試器中檢查它顯示它是一個盒裝小數。如果我將 select 更改為
SELECT CAST(@@IDENTITY as int)
,則 GetValue 的返回是一個裝箱的 int 並且不會引發異常。Id 列絕對是 int 類型;為什麼會
SELECT @@IDENTITY
返回小數?一些附加資訊:
- 數據庫是全新的。
- 客戶表是我添加到其中的唯一對象。數據庫中沒有其他(使用者)表、視圖、觸發器或儲存過程。
- 數據庫中有 10 行,ID 為 1,2,3,4,5,6,7,8,9,10(即列不超出 int 的限制)。
我的表定義是
CREATE TABLE [dbo].[Customers]( [Id] [int] IDENTITY(1,1) NOT NULL, [Type] [int] NOT NULL, [Name] [nvarchar](255) NOT NULL, [Address] [nvarchar](1000) NOT NULL, [ContactName] [nvarchar](255) NOT NULL, [ContactNumber] [nvarchar](50) NOT NULL, [ContactEmail] [nvarchar](255) NOT NULL, [Supplier] [nvarchar](255) NOT NULL, CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
- @@identity 返回一個數字(38,0)。您需要將其轉換為 int。
SELECT CAST(@@identity AS INT) 2. 另外,請嘗試改用 scope_identity。如果您在客戶表上有任何觸發器,您最終可能會從另一個表中獲取最後一個身份。 3. 最後,由於您使用的是dapper,因此您需要將所有這些包裝在一個儲存過程中,以便保證您在同一批次中執行插入,然後對標識執行選擇。
從理論上講,它應該在大部分時間都可以自己執行這兩個操作。但是,如果您必須訪問數據庫兩次,則可能會出現問題。(例如,這如何與連接池一起工作?丟棄的連接呢?等等。)如果你只是把它全部放在一個儲存過程中,你就不必擔心以後的額外工作。