C#SQL聚合ExecuteScalar返回查询

时间:2012-06-23 14:29:36

标签: c# null aggregate-functions tostring executescalar

一个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或缺少name,则返回null。

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

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

在搜索网页时,我没有找到一个可以理解的解释。

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

有什么区别:

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

谢谢你, deDogs

3 个答案:

答案 0 :(得分:3)

docs

中的

as

  

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;
docs

中的

ToString()

  

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();

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如果对象类型与您尝试将其强制转换为匹配,则'as'关键字将返回null。

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