Какой тип данных возвращает метод SQLCommand ExecuteScalar ()? - PullRequest
5 голосов
/ 19 октября 2010

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

Ответы [ 3 ]

10 голосов
/ 19 октября 2010

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

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

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

2 голосов
/ 19 октября 2010

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

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

0 голосов
/ 19 октября 2010

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

SELECT SCOPE_IDENTITY()

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

...