Как предложил @ Nick.McDermaid, попробуйте очистить данные и выполнить приведение с использованием производного столбца, прежде чем вставить его в SQL Server. Также убедитесь, что вы проверите для значений NULL. Вы можете использовать следующее выражение:
ISNULL([Price]) ? NULL(DT_CY) : ([Price] == "" ? NULL(DT_CY) : (DT_CY)(REPLACE(REPLACE((DT_WSTR,50)[Price],"$",""),",","")))
После удаления знака $
и запятых ,
операция приведения будет работать нормально.
Полезная ссылка
Нет, Вы не можете. ExecuteScalar () метод разработан для возврата как единственное значение, которое возвращено в наборе результатов. В основном, значение в первом столбце первой возвращенной строки.
Для получения возвращаемого значения необходимо добавить параметр к объекту SQLCommand. Используйте имя "@RETURN_VALUE" и укажите направление параметра Возврата при создании объекта параметра. Можно затем использовать ExecuteNonQuery () метод.
Я должен отметить, что IMO, возвращаемые значения хранимой процедуры должны просто указать на состояние процедуры. Все данные должны быть возвращены через наборы результатов или выходные параметры.
Отвечать на Ваш другой вопрос, (интервал) - бросок, который является, в действительности отличающийся, чем преобразование (Преобразовать. ToInt32).
В броске Вы - вид высказывания, что бросаемый объект действительно имеет тип, который Вы не бросаете к так никакому реальному преобразованию/парсингу, сделан. Так как интервал не может быть пустым, бросок недопустим, когда объект, который Вы бросаете, является несуществующим, и исключение выдается.
С преобразованием некоторые происходят на самом деле парсинг и логика, и это обрабатывает ситуацию, где преобразовываемый объект является несуществующим.
Существует еще некоторая информация об этом здесь.