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

В 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());

person Patty    schedule 18.10.2010    source источник
comment
Что произойдет, если вы позвоните GetType()?   -  person SLaks    schedule 19.10.2010
comment
Вау, почему я не подумал об этом? Возвращает десятичную дробь. Спасибо.   -  person Patty    schedule 19.10.2010


Ответы (3)


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

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

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

person Anthony Pegram    schedule 18.10.2010

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

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

person SLaks    schedule 18.10.2010
comment
Чтобы расширить этот ответ, типом возвращаемого значения ExecuteScalar является Object, что означает, что любой тип значения будет помещен в коробку, вы не можете преобразовать тип значения в штучной упаковке к чему-либо, кроме исходного типа - person Steve Ellinger; 19.10.2010

С конца вашего оператора INSERT

SELECT SCOPE_IDENTITY()

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

person Dave Barker    schedule 18.10.2010