J'utilise Dapper pour exécuter la requête suivante sur une instance SQL Server 2008 R2 Express à partir d'une application 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
L'appel à connection.Query<int>(sql, ...)
lève une exception de distribution non valide. Je l'ai débogué et c'est au point où Dapper appelle GetValue
les retournés SqlDataReader
.
Le type de retour de GetValue
est Object
, l'inspectant dans le programme de débogage, c'est une décimale encadrée.
Si je change la sélection en SELECT CAST(@@IDENTITY as int)
, le retour de GetValue est un entier encadré et l'exception n'est pas levée.
La colonne Id est définitivement de type int; Pourquoi SELECT @@IDENTITY
retournerait une décimale?
Quelques informations supplémentaires:
- La base de données est toute neuve.
- La table Customers est le seul objet que je lui ai ajouté. Il n'y a aucune autre table (utilisateur), vue, déclencheur ou procédure stockée dans la base de données.
- Il y a 10 lignes dans la base de données, les ID sont 1,2,3,4,5,6,7,8,9,10 (c'est-à-dire que la colonne n'est pas au-delà des limites d'un int).
Ma définition de table est
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]