Приведение или преобразование при извлечении данных из базы данных?
Вопрос
При доступе к объекту в DataTable, полученному из базы данных, есть ли какие-либо причины не приводить объект к желаемому типу или есть причины использовать convert ?Я знаю, что правило применяется, когда мы знаем, с каким типом данных мы работаем, и преобразуется при попытке изменить тип данных на то, чем он не является.Предполагая, что мы знаем, какой тип данных хранится в столбце, приведение кажется подходящим, но есть ли какие-либо проблемы с типом базы данных, которые означают, что мы не можем полагаться на это?
Решение
Я бы всегда бросал, по тем причинам, которые вы изложили.Я знаю о проблемах, с которыми вам нужно справиться, вот они:
Очевидно, что вам нужно уметь обрабатывать DBNulls (напримерпутем тестирования с помощью Convert.IsDBNull)
В случае ExecuteScalar я считаю, что вам нужно проверить наличие null, а также DBNull.
Функции SQL Servers @@IDENTITY и SCOPE_IDENTITY возвращают числовое значение (decimal) даже для столбцов, которые объявлены как INT.В этом случае вы можете дважды ввести "(int) (десятичное) значение" или обработать его в коде T-SQL, например:.
ВСТАВИТЬ В MyTable ...ВЫБЕРИТЕ AutoIdColumn Из MyTable, ГДЕ AutoIdColumn = SCOPE_IDENTITY()
или
INSERT INTO MyTable ...
SELECT CAST(SCOPE_IDENTITY() AS INT)
Другие советы
CAST
и CONVERT
используются для явного преобразования выражения одного типа данных в другой. Однако с помощью CONVERT
вы также можете указать стиль format .
Синтаксис для CAST:
CAST ( expression AS data_type [ (length ) ])
Синтаксис для CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
При получении из RDBMS вы должны позволить драйверу базы данных обрабатывать сортировку между собственным и запрошенным типом.
CAST санкционирован стандартами SQL и работает на самом большом количестве платформ RDBMS. Р>
CONVERT доступен на меньшем количестве платформ.
Если у вас есть многоплатформенные выводы, CONVERT следует использовать только для особых случаев, таких как пользовательское форматирование, которое невозможно выполнить с помощью CAST.