SQLCommand方法ExecuteScalar()返回什么数据类型?

时间:2010-10-18 23:34:31

标签: c# sql-server ado.net scope-identity

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

3 个答案:

答案 0 :(得分:10)

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

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

因此,如果你想要直接演员,你可以(int)(decimal)cmd.ExecuteScalar();。请注意,十进制到int转换可能会在最严格的意义上丢失信息,因此请注意。但是如果您的标识列是整数,则转换将是安全的。

答案 1 :(得分:2)

它可能会返回一个不同数字类型的盒装实例,例如long A boxed long cannot be converted to int

您可以在返回值上调用GetType()以查看它的确实类型。

答案 2 :(得分:0)

从INSERT语句的末尾

SELECT SCOPE_IDENTITY()

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