Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLCommand方法ExecuteScalar()返回什么数据类型?_C#_Sql Server_Ado.net_Scope Identity - Fatal编程技术网

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

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

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

它可能返回不同数值类型的装箱实例,例如
long


您可以在返回值上调用
GetType()
,查看它实际上是什么类型。

从INSERT语句末尾开始

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

SCOPE\u identity()
在代码中返回一个
decimal
,在TSQL中也称为
NUMERIC(38,0)


因此,如果您想要直接强制转换,可以执行
(int)(decimal)cmd.ExecuteScalar()。请注意,从严格意义上讲,十进制到整数的转换可能会丢失信息,因此请注意。但是如果您的标识列是一个整数,那么转换将是安全的。

如果调用
GetType()
,会发生什么?哇,为什么我没有想到呢?它返回一个小数点。谢谢。要扩展这个答案,ExecuteScalar返回类型是Object,这意味着任何值类型都将被装箱,您不能将装箱的值类型强制转换为原始类型以外的任何类型