Типа int32.TryParse () или (int?)команда.Executescalar так()


У меня есть SQL-запрос, который возвращает только одно поле-идентификатор типа INT.

И я должен использовать его как целое число в коде C#.

Какой способ быстрее и использует меньше памяти?

int id;
if(Int32.TryParse(command.ExecuteScalar().ToString(), out id))
{
  // use id
}

Или

int? id = (int?)command.ExecuteScalar();
if(id.HasValue)
{
  // use id.Value
}

Или

int? id = command.ExecuteScalar() as int?;
if(id.HasValue)
{
  // use id.Value
}
7 17

7 ответов:

Разница между этими тремя показателями незначительна. Узким местом является перемещение данных из БД в приложение, а не тривиальное приведение или вызов метода.

Я бы пошел с:

int? id = (int?)command.ExecuteScalar();
if(id.HasValue)
{
  // use id.Value
}

Он терпит неудачу раньше , Если однажды люди изменят команду, чтобы вернуть строку или дату, по крайней мере, он рухнет, и у вас будет шанс исправить это.

Я бы также просто пошел с простым int приведением , если бы я всегда ожидал, что команда вернет один результат.

Примечание, я обычно предпочитаю возвращать out param, чем выполнять execute scalar, execute scalar чувствует себя хрупким (соглашение, что первый столбец в первой строке является возвращаемым значением, не подходит для меня).

Если вы ожидаете, что команда вернет null, вы должны иметь в виду, что database null ( DBNull) - это не то же самое, что .NET null. Итак, преобразование DBNull в int? потерпеть неудачу.

Я бы предложил следующее:

object result = command.ExecuteScalar();
int? id = (int?)(!Convert.IsDBNull(result) ? result : null);

Если ничего из вышеперечисленного не работает (особенно для пользователей, которые борются с MySQL) почему бы вам не попробовать следующее?

int id = Convert.ToInt32(cmd.ExecuteScalar().ToString());

Последнее. Convert.ToInt32() также является опцией.

int Result = int.Parse(Command.ExecuteScalar().ToString());

Будет работать в C#.

Использовать id.HasValue для максимального Nullable типа cool-factor!

if ((Int32)cmd.ExecuteScalar () ** 1) //en esta parece qu esta el error pero no lo veo
{
    Response.Redirect("Default.aspx");
}
else
{
    Response.Redirect("error.htm") ;
}