2012-06-23 6 views
2

Функция агрегации SQL, подсчитывающая число имен, входящих в БД.C# SQL Aggregate ExecuteScalar Возвращаемый запрос

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; 

не возвращает правильное значение. Он возвращает null для обоих, если имя присутствует или отсутствует в столбце имени.

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

правильно возвращается. Это возвращает «1», если присутствует, и «0», если отсутствует.

При поиске в Интернете я не нашел понятного объяснения.

Я прочитал, что если имя отсутствует в столбце имен, то cmd.ExecuteScalar вернет null.

В чем разница между:

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

Спасибо, deDogs

+1

Подобный вопрос задают и ответил здесь: http://stackoverflow.com/questions/2099900/difference-between-tostring-and-as-string-in-c-sharp – 03Usr

ответ

3

as в docs

The as operator is used to perform conversions between compatible types.

The as operator is like a cast except that it yields null on conversion failure instead of raising an exception

// 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() в docs

ToString is the major formatting method in the .NET Framework. It converts an object to its string representation so that it is suitable for display. (For information about formatting support in the .NET Framework, see Formatting Types.)

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

Спасибо, да, я прочитал это и понял, но когда выполняется, cmd.ScalarExecute() в качестве строки возвращает null, если имя присутствует или отсутствует. Где cmd.ScalarExecute(). ToString(); возвращает правильные результаты. – deDogs

+0

Я добавил дополнительные комментарии. Просто 'ExecuteScalar' возвращает int. Первая опция ('as') вернет значение null, потому что' int' не 'string', вторая опция вернет правильное значение, потому что вы вызываете метод' int.ToString() ', который преобразует значение' int' в значение 'string' , – Zbigniew

+0

Спасибо, я пропустил идею совместимых типов. Итак, я попробовал: int? value = (int?) cmd.ExecuteScalar(); Я бы подумал, что это сработает, но оно вызывает недопустимый листинг? – deDogs

0

Вы делаете две разные вещи выше. Давайте изменим код на следующее:

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

str1 будет нулевым, поскольку десятичное не может быть приведен в строку. str2 будет значением, потому что вы можете вызывать ToString() в десятичной системе.

+0

Используя код, есть две строки с ошибкой: десятичное значение = cmd.ExecuteScalar(); Ошибка компиляции: cann't конвертировать объект в десятичный. string str1 = значение как строка; Ошибка компиляции: cann't преобразовать десятичную строку в строку. – deDogs

+0

Это возможно - я не пытался его скомпилировать. Я просто написал это, чтобы проиллюстрировать, почему вы видите разные результаты. –

+0

Что делать, если скачок Execute возвращает null или DBNull? Стандартный десятичный тип не является нулевым ... – aleroot

0

'как' ключевое слово будет возвращать нулевое значение, если тип объекта не соответствует тому, что вы пытаетесь брось его.

Что происходит в вашем случае, так это то, что возвращаемый объект является int и когда вы вызываете toString на это, он даст вам строковое представление целого числа. Когда вы используете против него, он дает вам нуль.

+0

** bold ** Когда вы используете против него, он дает вам нуль. ** bold ** Использование оператора as для целого числа возвращает null? – deDogs

+0

В этом случае да. Эффективно, как это похоже на кастинг, за исключением того, что вы получите нуль вместо генерируемого исключения. Так как у вас есть int и вы используете 'as String', вы получите нуль. – Blueberry

+0

Спасибо, что-то я не понял. Я только что узнал что-то очень важное. Спасибо вам всем... – deDogs