Sto usando Dapper per eseguire la seguente query su un'istanza di SQL Server 2008 R2 Express da un'applicazione 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
La chiamata a connection.Query<int>(sql, ...)
sta generando un'eccezione Cast non valida. Ho eseguito il debug ed è nel punto in cui Dapper chiama GetValue
il reso SqlDataReader
.
Il tipo di ritorno GetValue
è Object
, controllandolo nel debugger show è un decimale inscatolato.
Se cambio la selezione in SELECT CAST(@@IDENTITY as int)
, il ritorno di GetValue è un int box e l'eccezione non viene generata.
La colonna Id è sicuramente di tipo int; Perché dovrebbe SELECT @@IDENTITY
restituire un decimale?
Alcune informazioni aggiuntive:
- Il database è nuovo di zecca.
- La tabella Clienti è l'unico oggetto che ho aggiunto ad essa. Non ci sono altre tabelle (utente), viste, trigger o procedure memorizzate nel database.
- Ci sono 10 righe nel database, gli ID sono 1,2,3,4,5,6,7,8,9,10 (cioè la colonna non è oltre i limiti di un int).
La mia definizione di tabella è
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]