2

这是我给出错误的代码,查询返回特定项目的值。

同样在数据库端,即使我设置了条件,如果阅读器有行,那么查询也会返回行,然后只将它分配给一个变量,但它仍然会引发错误,例如。

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
4

2 回答 2

6

这是因为你是直接访问数据而不读取它,试试这个,

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

参考


您的代码的清理版本

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 注入的影响。尝试使用参数化查询来避免这种情况

于 2013-11-14T11:28:07.940 回答
2

如果您只是返回一个标量值,请使用:

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

这将返回一个object可以转换为必要类型的它,从而允许您在代码末尾的比较继续正常进行,而SqlDataReader根本不需要 a 。但请注意,由于您的 sql 未包含在 中ISNULL(),因此返回的值可能为 null,在这种情况下您可能希望检查这一点。进一步说明,使用参数化查询!

于 2013-11-14T11:32:30.497 回答