Saya menggunakan Dapper untuk menjalankan kueri berikut terhadap contoh SQL Server 2008 R2 Express dari aplikasi ASP.NET MVC 3 (.NET 4.0).
INSERT INTO Customers (
Type, Name, Address, ContactName,
ContactNumber, ContactEmail, Supplier)
VALUES (
@Type, @Name, @Address, @ContactName,
@ContactNumber, @ContactEmail, @Supplier)
SELECT @@IDENTITY
Panggilan untuk connection.Query<int>(sql, ...)
melempar Pengecualian Pemain Tidak Valid. Saya sudah men-debug dan itu pada titik di mana Dapper memanggil GetValue
yang dikembalikan SqlDataReader
.
Jenis kembalinya GetValue
adalah Object
, memeriksanya di acara debugger itu adalah desimal kotak.
Jika saya mengubah pilih ke SELECT CAST(@@IDENTITY as int)
, kembalinya GetValue adalah kotak int dan pengecualian tidak dibuang.
Kolom Id jelas bertipe int; Mengapa SELECT @@IDENTITY
mengembalikan desimal?
Beberapa informasi tambahan:
- Basis datanya baru.
- Tabel Pelanggan adalah satu-satunya objek yang saya tambahkan ke dalamnya. Tidak ada tabel (pengguna) lain, pandangan, pemicu atau prosedur tersimpan dalam database.
- Ada 10 baris dalam database, ada Id 1,2,3,4,5,6,7,8,9,10 (yaitu kolom tidak di luar batas int).
Definisi tabel saya adalah
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]