Estou usando o Dapper para executar a seguinte consulta em uma instância do SQL Server 2008 R2 Express de um aplicativo 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
A chamada para connection.Query<int>(sql, ...)
está lançando uma exceção de conversão inválida. Eu depurei e é no ponto em que Dapper chama GetValue
o retornado SqlDataReader
.
O tipo de retorno GetValue
é Object
: inspecionando-o no programa de depuração, é um decimal em caixa.
Se eu alterar o select para SELECT CAST(@@IDENTITY as int)
, o retorno de GetValue será um int em caixa e a exceção não será lançada.
A coluna Id é definitivamente do tipo int; Por que SELECT @@IDENTITY
retornaria um decimal?
Algumas informações adicionais:
- O banco de dados é novo em folha.
- A tabela Customers é o único objeto que eu adicionei a ela. Não há outras tabelas (usuários), visualizações, gatilhos ou procedimentos armazenados no banco de dados.
- Existem 10 linhas no banco de dados, existem IDs 1,2,3,4,5,6,7,8,9,10 (ou seja, a coluna não está além dos limites de um int).
Minha definição de tabela é
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]