Вопрос

У меня есть 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
}
Это было полезно?

Решение

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

Я бы пошел с:

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

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

Я бы также просто выбрал простой int бросать ЕСЛИ Я всегда ожидал, что команда вернет один результат.

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

Другие советы

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

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

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

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

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

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

Последний. Convert.ToInt32() это тоже вариант.

Используйте id.HasValue для максимального крутого фактора Nullable Type!

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") ;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top