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
、デバッガーショーでそれを検査し、それがボックス10進数であることを示します。
selectをに変更するとSELECT CAST(@@IDENTITY as int)
、GetValueの戻り値はボックス化されたintになり、例外はスローされません。
Id列は間違いなくint型です。なぜSELECT @@IDENTITY
小数を返すのですか?
追加情報:
- データベースは真新しいです。
- Customersテーブルは、私がそれに追加した唯一のオブジェクトです。データベースには、他の(ユーザー)テーブル、ビュー、トリガー、またはストアドプロシージャはありません。
- データベースには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]