一个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
答案 0 :(得分:3)
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时,它将为您提供整数的字符串表示形式。当你使用它时,它会给你一个空值。