C# SQL Aggregate ExecuteScalar Обратный запрос
Агрегатная функция SQL, подсчитывающая количество именных записей в БД.
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;
не возвращает правильное значение. Он возвращает ноль для обоих, если имя присутствует или отсутствует в столбце имени.
value = cmd.ExecuteScalar().ToString();
возвращается правильно. Возвращает "1", если присутствует, и "0", если отсутствует.
В поиске в Интернете я не нашел понятного объяснения.
Я прочитал, что если имя отсутствует в столбце имени, то cmd.ExecuteScalar
вернусь null
,
В чем разница между:
value = cmd.ExecuteScalar() as string;
value = cmd.ExecuteScalar().ToString();
Спасибо, deDogs
3 ответа
as
в документах
Оператор as используется для преобразования между совместимыми типами.
Оператор as похож на приведение, за исключением того, что он возвращает ноль при сбое преобразования вместо вызова исключения
// 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()
в документах
ToString является основным методом форматирования в.NET Framework. Он преобразует объект в его строковое представление, так что он подходит для отображения. (Информацию о поддержке форматирования в.NET Framework см. В разделе Типы форматирования.)
// return a string that represents the current object
// will return correct value because it casts Int32 value to string value
value = cmd.ExecuteScalar().ToString();
Вы делаете две разные вещи выше. Давайте изменим ваш код на следующее:
decimal value = cmd.ExecuteScalar();
string str1 = value as string;
string str2 = value.ToString();
str1 будет нулевым, потому что десятичное не может быть приведено к строке. str2 будет значением, потому что вы можете вызывать ToString() с десятичной дробью.
Ключевое слово as возвращает ноль, если тип объектов не соответствует тому, к чему вы пытаетесь его привести.
В вашем случае происходит то, что возвращаемый объект является int, и когда вы вызываете toString для этого, он даст вам строковое представление целого числа. Когда вы используете против него, это дает вам ноль.