【问题标题】:Int32.TryParse() or (int?)command.ExecuteScalar()Int32.TryParse() 或 (int?)command.ExecuteScalar()
【发布时间】:2010-11-13 13:55:51
【问题描述】:

我有一个 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
}

【问题讨论】:

  • 我知道这已经过时了,但相关的 Donald Knuth 引用:“程序员浪费了大量时间来思考或担心他们程序中非关键部分的速度,而这些效率上的尝试实际上已经考虑到调试和维护时会产生强烈的负面影响。我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源。但我们不应该放弃关键的 3% 的机会。
  • 嘿@DannyNeumann,总的来说,我认为在这里发布它没有多大意义,因为它是 2009 年的问题。特别是,编写高效的代码仍然很重要。这就是我学会这样做的方式。我每天都会看到非常适合 Knuth 引用的可怕、可怕的代码。话虽如此,不应该花太多时间在非关键部分的过早优化上,但同时也不应该低效地编写非关键部分。

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


【解决方案1】:

三个性能方面的差异可以忽略不计。瓶颈是将数据从数据库移动到您的应用程序,而不是微不足道的强制转换或方法调用。

我会选择:

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

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

我也会使用简单的int cast IF 我一直希望该命令返回一个结果。

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

【讨论】:

  • ExecuteScalar() 在 vb 中是一个巨大的胜利,您可以对它执行 CInt() 或 CStr()。
【解决方案2】:

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

我建议如下:

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

【讨论】:

  • 请记住,如果执行标量不返回任何行,您将得到一个空值。你是对的,如果第一列的第一行是空的,你可能会遇到麻烦。
  • 但又是 ID(我至少将其视为身份/密钥),所以 DBNull 不是问题
  • @Sam Saffron,同意空行集。 @Rune FS,我们不知道这里的底层逻辑。我不会假设查询是否可能返回 null,仅基于变量名。
  • @VladV 同意你应该对变量名进行第二次猜测,但我指的是它是一个返回的 ID(在问题中这么说)并且因为 ID 在 (MS )数据库术语是唯一的非空值,问题要么不明确,要么查询不会返回 DBNulls :)
  • 你能把它减少到int? id = (int?)command.ExecuteScalar() ?? null;吗?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:
    int Result = int.Parse(Command.ExecuteScalar().ToString());
    

    将在 C# 中工作。

    【讨论】:

    • 这是一种不好的方法,首先转储到字符串,然后在对象已经是 int 时进行解析,只需要强制转换。
    【解决方案5】:

    后者。 Convert.ToInt32() 也是一个选项。

    【讨论】:

    • 第一种方法来自撒旦,原因有很多。它速度较慢且可读性较差。糟糕。
    • Convert.ToInt32() 对我有用,而使用 command.ExecuteScalar();
    【解决方案6】:

    使用 id.HasValue 获得最大的 Nullable Type 酷因子!

    【讨论】:

      【解决方案7】:
      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") ;
      }
      

      【讨论】:

      • 这是一个答案吗?或者你想寻求帮助?因为那个西班牙语评论意味着'看起来错误在这里,但我看不到'
      猜你喜欢
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多