Korzystam z Dappera, aby wykonać następujące zapytanie przeciwko wystąpieniu programu SQL Server 2008 R2 Express z aplikacji 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
Wezwanie connection.Query<int>(sql, ...)
to zgłasza wyjątek dotyczący nieprawidłowej obsady. Debugowałem go i jest to punkt, w którym Dapper wzywa GetValue
zwracany SqlDataReader
.
Zwracanym typem GetValue
jest to Object
, że sprawdzanie go w programie debuggera jest dziesiętne.
Jeśli zmienię opcję select na SELECT CAST(@@IDENTITY as int)
, zwracana wartość GetValue jest zapakowana w int i wyjątek nie jest zgłaszany.
Kolumna Id jest zdecydowanie typu int; Po co SELECT @@IDENTITY
zwracać dziesiętne?
Niektóre dodatkowe informacje:
- Baza danych jest nowa.
- Tabela klientów jest jedynym obiektem, który do niej dodałem. W bazie danych nie ma innych tabel (widoków), wyzwalaczy ani procedur przechowywanych (użytkowników).
- Baza danych zawiera 10 wierszy, tam Id to 1,2,3,4,5,6,7,8,9,10 (tj. Kolumna nie przekracza wartości int).
Moja definicja tabeli to
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]