C# SQLCommand方法ExecuteScalar()返回什么数据类型?
在SQL Server中,ID是一个非空整数,是一个标识 当我运行以下代码时,我在最后一行得到一个InvalidCastException:C# SQLCommand方法ExecuteScalar()返回什么数据类型?,c#,sql-server,ado.net,scope-identity,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()";
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());
它可能返回不同数值类型的装箱实例,例如
long
您可以在返回值上调用
GetType()
,查看它实际上是什么类型。从INSERT语句末尾开始
SELECT SCOPE_IDENTITY()
它返回插入到[Users]表中的行的标识值。SCOPE\u identity()
在代码中返回一个decimal
,在TSQL中也称为NUMERIC(38,0)
因此,如果您想要直接强制转换,可以执行
(int)(decimal)cmd.ExecuteScalar()代码>。请注意,从严格意义上讲,十进制到整数的转换可能会丢失信息,因此请注意。但是如果您的标识列是一个整数,那么转换将是安全的。如果调用GetType()
,会发生什么?哇,为什么我没有想到呢?它返回一个小数点。谢谢。要扩展这个答案,ExecuteScalar返回类型是Object,这意味着任何值类型都将被装箱,您不能将装箱的值类型强制转换为原始类型以外的任何类型