Я использую Dapper для выполнения следующего запроса к экземпляру SQL Server 2008 R2 Express из приложения 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
Призыв connection.Query<int>(sql, ...)
вызывает недопустимое исключение приведения. Я отладил это, и это в тот момент, когда Даппер звонит GetValue
возвращенным SqlDataReader
.
Тип возвращаемого значения GetValue
- Object
проверка его в шоу отладчика - это десятичное число в штучной упаковке.
Если я изменяю выбор на SELECT CAST(@@IDENTITY as int)
, возвращаемое значение GetValue представляет собой упакованный int, и исключение не выдается.
Столбец Id определенно имеет тип int; Зачем SELECT @@IDENTITY
возвращать десятичную?
Некоторая дополнительная информация:
- База данных совершенно новая.
- Таблица Customers - это единственный объект, который я добавил к нему. В базе данных нет других (пользовательских) таблиц, представлений, триггеров или хранимых процедур.
- В базе данных 10 строк, там Id 1,2,3,4,5,6,7,8,9,10 (то есть столбец не выходит за пределы int).
Мое определение таблицы
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]