2013-11-14 2 views
1

Вот мой код, который дает ошибку, запрос возвращает значение для определенного элемента.Неверная попытка чтения данных, даже если данные присутствуют в SqlDataReader в vb.net.

Также в стороне базы данных запрос возвращает строки, даже если я установил условие, что если читатель имеет строки, то присваивает ему только переменную, но при этом она вызывает ошибку, например.

dqty = sqlreader("qty") 

Код:

Private Function checkquantity(ByVal code As String, ByVal quan As Integer) As Boolean 
    sqlcommand.CommandText = "select sum(qty) as qty from pos_stock_balance where item_code='" & code & "'" 
    sqlcommand.Connection = AppsCon 
    sqlreader = sqlcommand.ExecuteReader 
    If sqlreader.HasRows Then 

     dqty = sqlreader("qty") 
     sqlreader.Close() 

    Else 
     sqlreader.Close() 
    End If 
    If quan > dqty Then 
     Return False 
    Else 
     Return True 

    End If 
End Function 

ответ

6

Это потому, что вы непосредственно доступ к данным, не читая его, попробуйте это,

If sqlreader.HasRows Then 
     If sqlreader.read() 
     dqty = sqlreader("qty") 
     sqlreader.Close() 
     End If 
Else 
     sqlreader.Close() 
End If 

Reference


Убирали версию вашего кода,

Private Function checkquantity _ 
(ByVal code As String, ByVal quan As Integer) As Boolean 

    try 

    sqlcommand.CommandText = "select" _ 
    & "sum(qty) as qty from pos_stock_balance where item_code='" & code & "'" 

    sqlcommand.Connection = AppsCon 
    sqlreader = sqlcommand.ExecuteReader 

    If sqlreader.read() Then 
     dqty = sqlreader("qty") 
    End If 

    If quan > dqty Then 
     Return False 
    Else 
     Return True 
    End If 

    Finally 
     sqlreader.Close() 
    End try 

End Function 

Хотя я очистить свой код, ваш код по-прежнему уязвимы для sql injection. Попробуйте использовать параметризованные запросы, чтобы избежать этого

+1

Отсутствует уловка – Ric

+0

@Ric Catch не является обязательной. –

+1

Достаточно честный, подумал, что вы можете что-то сделать, если исключение будет поднято. Неважно. – Ric

2

Если вы просто возвращаетесь использовать скалярное значение:

dqty = CType(sqlcommand.ExecuteScalar(), Integer) 
... 
If quan > dqty Then 
    Return False 
Else 
    Return True  
End If 

Это возвращает object, который может быть преобразован к нужному типу, позволяя ваше сравнение в конце коды продолжать как обычно, без необходимости в SqlDataReader. Но будьте осторожны, так как ваш sql не завернут в ISNULL(), возвращаемое значение может быть пустым, и в этом случае вы можете проверить это. В качестве дополнительной информации используйте параметризованные запросы!

+0

downvoted, потому что? – Ric

+0

Я видел ваш ответ now.i уже проголосовал за этот ответ, и после этого у меня я получил обновление сейчас. Хорошо, что оба ответа отвечают на мой вопрос, и хорошо ваш позволяет мне удалить ненужные декларации и код ... ну, это вопрос выбора. ..i не могу отметить оба как ответы правильно ric .. хорошо спасибо за поддержку ответ дорогой .... –

+0

не заботится хорошо, что он отсортирован в любом случае! – Ric

Смежные вопросы