Int32.TryParse()或(int?)command.ExecuteScalar()

aba*_*hev 17 .net c# ado.net tryparse executescalar

我有一个SQL查询,它只返回一个字段 - 一个INT类型的ID.

我必须在C#代码中将其用作整数.

哪种方式更快,占用内存更少?

int id;
if(Int32.TryParse(command.ExecuteScalar().ToString(), out id))
{
  // use id
}
Run Code Online (Sandbox Code Playgroud)

要么

int? id = (int?)command.ExecuteScalar();
if(id.HasValue)
{
  // use id.Value
}
Run Code Online (Sandbox Code Playgroud)

要么

int? id = command.ExecuteScalar() as int?;
if(id.HasValue)
{
  // use id.Value
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*ron 22

三种表现之间的差异可以忽略不计.瓶颈是将数据从数据库移动到您的应用程序,而不是简单的强制转换或方法调用.

我会选择:

int? id = (int?)command.ExecuteScalar();
if(id.HasValue)
{
  // use id.Value
}
Run Code Online (Sandbox Code Playgroud)

早期失败,如果有一天人们改变命令返回一个字符串或日期,至少它会崩溃,你将有机会来修复它.

我也只是一个简单的去intIF我一直期待的命令返回一个结果.

注意,我通常更喜欢返回一个out参数而不是执行标量,执行标量感觉很脆弱(第一行中的第一列是返回值的惯例不适合我).


Vla*_*adV 19

如果您希望该命令返回null,则应记住数据库null(DBNull)与.NET null不同.那么,将DBNull转换为int?会失败的.

我建议如下:

object result = command.ExecuteScalar();
int? id = (int?)(!Convert.IsDBNull(result) ? result : null);
Run Code Online (Sandbox Code Playgroud)

  • 请记住,如果执行标量没有返回任何行,则会得到null.你是对的,如果第一列中的第一行为空,你可能会遇到麻烦. (2认同)

hun*_*der 5

如果以上都不起作用(特别是对于与MySQL作战的用户),为什么不尝试以下操作呢?

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString());
Run Code Online (Sandbox Code Playgroud)