【问题标题】:C# SQL Aggregate ExecuteScalar Return QueryC# SQL 聚合 ExecuteScalar 返回查询
【发布时间】:2012-06-23 14:29:36
【问题描述】:

一个 SQL 聚合函数,用于计算 DB 中名称输入的数量。

string cnnStr = ConfigurationManager.ConnectionStrings["LGFConnectionString"].ConnectionString;
string mySQL = "SELECT COUNT(*) FROM  " + which.table + " WHERE " + which.column + " = ?pram;";
string value = null;

using (MySqlConnection cnn = new MySqlConnection(cnnStr))
{
        using (MySqlCommand cmd = new MySqlCommand(mySQL, cnn))
        {
            MySqlParameter param = new MySqlParameter("?pram", MySqlDbType.VarChar, 128);
            param.Value = which.text;
            cmd.Parameters.Add(param);

            cnn.Open();

            value = cmd.ExecuteScalar() as string;
            value = cmd.ExecuteScalar().ToString();

            cnn.Close();
        }
}

请注意,我已致电cmd.ExecuteScalar 两次。有趣的部分是查询返回不同的结果。

value = cmd.ExecuteScalar() as string;

没有返回正确的值。如果 name 列中存在或缺少 name,则返回 null。

value = cmd.ExecuteScalar().ToString();

正确返回。如果存在则返回“1”,如果缺失则返回“0”。

在网上搜索,我没有找到可以理解的解释。

我已经读到,如果名称列中缺少名称,那么 cmd.ExecuteScalar 将返回 null

有什么区别:

value = cmd.ExecuteScalar() as string;
value = cmd.ExecuteScalar().ToString();

谢谢你, 去狗

【问题讨论】:

标签: c# null aggregate-functions tostring executescalar


【解决方案1】:

as in docs

as 运算符用于执行兼容类型之间的转换。

as 运算符类似于强制转换,只是它在转换失败时产生 null 而不是引发异常

// if cmd.ExecuteScalar() is string then return string
// if not then return null
// this will return null, because cmd.ExecuteScalar() won't return string
// for your code it should return Int32
value = cmd.ExecuteScalar() as string;

ToString() in docs

ToString 是 .NET Framework 中的主要格式化方法。它 将对象转换为其字符串表示形式,使其适合 用于展示。 (有关 .NET 格式支持的信息 框架,请参阅格式化类型。)

// return a string that represents the current object
// will return correct value because it casts Int32 value to string value
value = cmd.ExecuteScalar().ToString();

【讨论】:

  • 谢谢,是的,我已经阅读并理解了,但是在执行时,如果名称存在或缺失,cmd.ScalarExecute() 作为字符串返回 null。其中 cmd.ScalarExecute().ToString();返回正确的结果。
  • 我添加了额外的 cmets。只需 ExecuteScalar 返回 int。第一个选项 (as) 将返回 null,因为 int 不是 string,第二个选项将返回正确的值,因为您正在调用 int.ToString() 方法,该方法将 int 值转换为 string 值。
  • 谢谢,我错过了兼容类型的想法。所以,我试过:int? value = (int?)cmd.ExecuteScalar();我认为这会起作用,但它会引发无效的演员表?
  • 看看this,你也可以试试投到long?
【解决方案2】:

如果对象类型与您尝试将其转换为的类型不匹配,则“as”关键字将返回 null。

在您的情况下发生的情况是返回的对象是一个 int,当您对此调用 toString 时,它将为您提供整数的字符串表示形式。当你对它使用 as 时,它会给你一个 null。

【讨论】:

  • bold当你使用 as 反对它时,它会给你一个空值。 bold 对整数使用 as 运算符返回 null?
  • 在这种情况下,是的。实际上,与强制转换类似,不同之处在于您将获得 null 而不是引发异常。因为你有一个 int 并且使用 'as String',你会得到一个 null 返回。
  • 谢谢,我没有意识到这一点。我刚刚学到了一些非常重要的东西。谢谢 - 所有...
【解决方案3】:

你在上面做了两件不同的事情。让我们将您的代码更改为以下内容:

decimal value = cmd.ExecuteScalar();
string str1 = value as string;
string str2 = value.ToString();

str1 将为空,因为十进制不能转换为字符串。 str2 将是值,因为您可以在小数点上调用 ToString()。

【讨论】:

  • 使用您的代码,有两行错误:十进制值 = cmd.ExecuteScalar();编译错误:无法将对象转换为十进制。字符串 str1 = 值作为字符串;编译错误:无法将十进制转换为字符串。
  • 有可能 - 我没有尝试编译它。我写它只是为了说明为什么你会看到不同的结果。
  • 如果 Execute 标量返回 null 或 DBNull 怎么办?标准小数是不可为空的类型...
  • 当他/她根据未返回 null 的问题获得数字返回值时。在我的回答中,我试图说明 as 和 ToString() 之间的区别,而不是解决所有其他可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多