5

在 SQL Server 中,ID 是一个非空整数和一个标识。

当我运行以下代码时,我在最后一行得到一个 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());
4

3 回答 3

10

SCOPE_IDENTITY()在代码中返回 a ,在 TSQL 中decimal也称为。NUMERIC(38,0)

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

所以如果你想要直接投射,你可以做(int)(decimal)cmd.ExecuteScalar();. 请注意,从最严格的意义上讲,从小数到整数的转换可能会丢失信息,因此请注意。但是您的身份列是一个整数,转换将是安全的。

于 2010-10-18T23:43:58.050 回答
2

它可能返回不同数字类型的盒装实例,例如long.
装箱的long不能转换为int.

你可以调用GetType()返回值来查看它到底是什么类型。

于 2010-10-18T23:36:09.270 回答
0

从您的 INSERT 语句的末尾

SELECT SCOPE_IDENTITY()

它返回插入到 [Users] 表中的行的标识值。

于 2010-10-18T23:38:56.673 回答