Типа 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 ответов:
Разница между этими тремя показателями незначительна. Узким местом является перемещение данных из БД в приложение, а не тривиальное приведение или вызов метода.
Я бы пошел с:
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);