Int32.TryParse()或(int?)command.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 } 

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

我会选择:

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

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

我也只是用一个简单的int IF我总是希望命令返回一个结果。

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

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

我建议如下:

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

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

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

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

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

将在C#中工作。

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

 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") ; }