Какой тип данных возвращает метод SQLCommand ExecuteScalar ()?

В SQL Server идентификатор – это не пустое целое число и идентификатор.

Когда я запускаю следующий код, я получаю InvalidCastException в последней строке:

SqlCommand cmd = new SqlCommand(); cmd.Connection = _conn; cmd.CommandText = @"INSERT INTO [Users] (Name, Email, Password) VALUES (@name, @email, @pass); SELECT SCOPE_IDENTITY()"; cmd.Parameters.AddWithValue("@name", newUser.Name); cmd.Parameters.AddWithValue("@email", newUser.Email); cmd.Parameters.AddWithValue("@pass", newUser.PasswordHash); int id = (int)cmd.ExecuteScalar(); 

Что такое ExecuteScalar (), возвращаемое сюда? Каким бы ни было его возвращение, ToString () делает его похожим на число, поэтому эта ужасная строка кода работает:

 int id = Int32.Parse(cmd.ExecuteScalar().ToString()); 

SCOPE_IDENTITY() возвращает decimal код в коде, иначе называемый NUMERIC(38,0) в TSQL.

http://msdn.microsoft.com/en-us/library/ms190315.aspx

Поэтому, если вам нужен прямой бросок, вы можете сделать (int)(decimal)cmd.ExecuteScalar(); , Обратите внимание, что преобразование десятичного числа в int может потерять информацию в строгом смысле, поэтому просто сообщите об этом. Но если ваш столбец идентификатора является целым числом, преобразование будет безопасным.

Вероятно, он возвращает экземпляр с коротким номером другого типа, например long .
Короткий long не может быть преобразован в int .

Вы можете вызвать GetType() в возвращаемом значении, чтобы узнать, какой тип он действительно есть.

С конца вашего заявления INSERT

 SELECT SCOPE_IDENTITY() 

Он возвращает значение идентификатора строки, вставленной в таблицу [Users].

  • Как включить Scope_Identity () в Int?
  • Есть ли способ вставки в две таблицы с FK от одного к другому?
  • IDENT_CURRENT возвращает последнее значение идентификатора, но SCOPE_IDENTITY не
  • Будет ли SCOPE_IDENTITY работать в этом случае?
  • Предложение SQL Server OUTPUT
  • Идентификатор вставки SQL из идентификатора IDENTITY вставляемой строки
  • Извлечь значение scope_identity в коде C # из хранимой процедуры в трехуровневой архитектуре
  • ASP Classic и SQL Server 2008 дают странный ответ
  • nextval и curval confusion в PostgreSQL
  • Возвращать идентификатор после вставки C # с помощью SQL Server
  • Entity Framework и SCOPE_IDENTITY
  • Interesting Posts
    Давайте будем гением компьютера.