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

发布于 2024-07-29 03:52:44 字数 447 浏览 7 评论 0原文

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

I have a SQL query which returns only one field - an ID of type INT.

And I have to use it as integer in C# code.

Which way is faster and uses less memory?

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

or

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

or

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

記柔刀 2024-08-05 03:52:44

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

我会同意:

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

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

我也只会使用一个简单的 int 强制转换 IF 我总是希望该命令返回单个结果。

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

The difference between the three performance wise is negligible. The bottleneck is moving the data from the DB to your app, not a trivial cast or method call.

I would go with:

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

It fails earlier, if one day people change the command to return a string or a date, at least it will crash and you will have a chance to fix it.

I would also just go with a simple int cast IF I always expected the command to return a single result.

Note, I usually prefer returning an out param than doing the execute scalar, execute scalar feels fragile (the convention that the first column in the first row is a return value does not sit right for me).

叶落知秋 2024-08-05 03:52:44

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

我建议如下:

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

If you expect the command to return null, you should keep in mind that database null (DBNull) is not the same as .NET null. So, conversion of DBNull to int? would fail.

I'd suggest the following:

object result = command.ExecuteScalar();
int? id = (int?)(!Convert.IsDBNull(result) ? result : null);
巷雨优美回忆 2024-08-05 03:52:44

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

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

If none of the above works (especially for users who are battling with MySQL)
why don't you try the following?

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString());
月亮邮递员 2024-08-05 03:52:44
int Result = int.Parse(Command.ExecuteScalar().ToString());

将在 C# 中工作。

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

will work in C#.

单身情人 2024-08-05 03:52:44

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

The latter. Convert.ToInt32() is also an option.

[旋木] 2024-08-05 03:52:44

使用 id.HasValue 获得最大的可空类型酷因子!

Use id.HasValue for maximum Nullable Type cool-factor!

太傻旳人生 2024-08-05 03:52:44
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") ;
}
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") ;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文