2015-08-28 26 views
-1

我意識到這已被問了一百萬次,但我找不到有效的答案。新的SQL服務器和vs 2010 vb(抱怨老闆,而不是我),做練習運行。不斷地得到一個VARCHAR到數值異常,如下所示:varchar數值異常

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() 

我已經通過驗證VARTYPE()中傳遞的數據確實是十進制(我是唯一一個測試,所以並不擔心誤差控制ATM )。我曾嘗試使用帶和不帶單引號的變量。 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() 

另外,在SQL中編寫IF/ELSE語句以在各種選擇中選擇是很奇怪的。對於SQL,您希望根據編寫描述一組數據的單個語句來思考。

+0

而該查詢甚至沒有使用數據庫。它可以全部完成而不需要調用數據庫服務器。 –

+0

絕對......但是我明白了他只是想讓sql在這一點上做_anything_。嬰兒的步驟。 –

+0

我會試試這個,謝謝!我還沒有學到理解參數的那麼遠,但這是一個很好的領導。 至於如果別的,它只是看看當變數通過時會發生什麼......我知道它需要調整。是的,你是非常正確的。我只是想了解SQL。 – Alice