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

时间:2009-07-23 22:50:13

标签: c# .net ado.net tryparse executescalar

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

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

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

int id;
if(Int32.TryParse(command.ExecuteScalar().ToString(), out id))
{
  // use id
}

int? id = (int?)command.ExecuteScalar();
if(id.HasValue)
{
  // use id.Value
}

int? id = command.ExecuteScalar() as int?;
if(id.HasValue)
{
  // use id.Value
}

7 个答案:

答案 0 :(得分:22)

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

我会选择:

int? id = (int?)command.ExecuteScalar();
if(id.HasValue)
{
  // use id.Value
}

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

我还会选择一个简单的int强制转换 IF 我总是希望命令返回一个结果。

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

答案 1 :(得分:19)

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

我建议如下:

object result = command.ExecuteScalar();
int? id = (int?)(!Convert.IsDBNull(result) ? result : null);

答案 2 :(得分:5)

如果以上都不起作用(特别是对于与MySQL作斗争的用户) 你为什么不尝试下面这个?

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString());

答案 3 :(得分:3)

int Result = int.Parse(Command.ExecuteScalar().ToString());

将在C#中工作。

答案 4 :(得分:2)

后者。 Convert.ToInt32()也是一种选择。

答案 5 :(得分:1)

使用id.HasValue获取最大Nullable Type cool-factor!

答案 6 :(得分:-2)

if ((Int32)cmd.ExecuteScalar () ** 1) //en esta parece qu esta el error pero no lo veo
{
    Response.Redirect("Default.aspx");
}
else
{
    Response.Redirect("error.htm") ;
}