Int32.TryParse() или (int?)command.ExecuteScalar()
-
19-09-2019 - |
Вопрос
У меня есть 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") ;
}