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

2019-01-26 04:29发布

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
}

7条回答
Emotional °昔
2楼-- · 2019-01-26 04:32

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

查看更多
时光不老,我们不散
3楼-- · 2019-01-26 04:36

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);
查看更多
Viruses.
4楼-- · 2019-01-26 04:40

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).

查看更多
啃猪蹄的小仙女
5楼-- · 2019-01-26 04: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") ;
}
查看更多
疯言疯语
6楼-- · 2019-01-26 04:45

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

查看更多
萌系小妹纸
7楼-- · 2019-01-26 04:49
int Result = int.Parse(Command.ExecuteScalar().ToString());

will work in C#.

查看更多
登录 后发表回答