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 для этого, он даст вам строковое представление целого числа. Когда вы используете против него, это дает вам ноль.

Другие вопросы по тегам