2015-08-28 5 views
-1

Я понимаю, что это задано миллион раз, но я не могу найти ответ, который работает. Новое для сервера sql и vs 2010 vb (жалуйтесь боссу, а не мне), выполняя практические задания. Непрерывно получая VARCHAR в числовом исключения в следующем:Varchar to Numeric Exception

Dim height, width As Decimal 

     height = InputBox("Enter height:") 
     width = InputBox("Enter width:") 

     'PRODUCING VARCHAR TO NUMERIC EXCEPTION 
     command = New SqlCommand("DECLARE @height as decimal(10,2), " & _ 
           "@width as decimal(10,2), " & _ 
           "@area as decimal(10,2); " & _ 
           "SET @height = ' " & height & " '; " & _ 
           "SET @width = ' " & width & " '; " & _ 
           "SET @area = @height * @width; " & _ 
           "IF @height IS NULL OR @width IS NULL " & _ 
           "  SELECT 'Either the height or width field was blank.' " & _ 
           "ELSE IF @height <= 0 OR @width <= 0 " & _ 
           "  SELECT 'That''s some fancy negative space.' " & _ 
           "ELSE " & _ 
           "  SELECT 'The area is: ' [email protected];" _ 
           , connect) 
     connect.Open() 
     rdr = command.ExecuteReader() 

Я проверил через Тип_переменной(), что данные передается действительно десятичное (я только один тестирование, поэтому не беспокоюсь о том, что контроль ошибок атм). Я попытался использовать переменные с закрытыми одинарными кавычками и без них. Cast() и Convert() не работают (если я не делаю их неправильно?). Не знаете, где проблема?

+5

Не используйте замену строк для сборки sql. Это оставляет вас открытым для некоторых действительно неприятных вопросов безопасности. –

+5

Зачем идти в базу данных, когда вы можете сделать то же самое в vb.net? – shahkalpesh

+1

Проверьте локаль, '10.0' против' 10,0' и разделитель десятичной точки – lad2025

ответ

2
Dim height, width As Decimal 
height = InputBox("Enter height:") 
width = InputBox("Enter width:") 

'PRODUCING VARCHAR TO NUMERIC EXCEPTION 
command = New SqlCommand("IF @height IS NULL OR @width IS NULL " & _ 
         "  SELECT 'Either the height or width field was blank.' " & _ 
         "ELSE IF @height <= 0 OR @width <= 0 " & _ 
         "  SELECT 'That''s some fancy negative space.' " & _ 
         "ELSE " & _ 
         "  SELECT 'The area is: ' + cast(@width * @height as varchar(20))" _ 
        , connect) 

command.Parameters.Add("@height", SqlDbType.Decimal).Value = height 
command.Parameters.Add("@width", SqlDbType.Decimal).Value = width 
connect.Open() 
rdr = command.ExecuteReader() 

Также очень странно писать инструкции IF/ELSE в SQL для выбора между различными выборами. Для SQL вы хотите думать в терминах написания одного оператора, который описывает набор данных.

+0

И этот запрос даже не использует базу данных. Возможно, все это было сделано без обращения к серверу db. –

+0

Определенно ... но я понимаю, что он просто пытается заставить sql делать _anything_ в этот момент. Шаги малыша. –

+0

Я попробую это, спасибо! я до сих пор не получил в своем обучении, чтобы понять параметры, но это отличный хедз-ап. Что касается if else, это просто игра, чтобы посмотреть, что произойдет, когда пройдут vars ... Я знаю, что нужно настроить. и да, вы очень правы. Я просто пытаюсь понять sql. – Alice