2014-01-28 31 views
1

上更新查询“没有为一个或多个必需的参数给定值”我收到错误错误:从ASP.NET

No value given for one or more required parameters

当我尝试执行以下代码

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 

    Dim t2 = TextBox2.Text 

    Dim dbcmd As OleDbCommand 
    dbcmd = New OleDbCommand("UPDATE login1 SET height ='" + TextBox2.Text + "' WHERE username =" + str, dbcon) //This is the part where the error is .... 
    dbcon.Open() 
    dbcmd.ExecuteNonQuery() 
    dbcon.Close() 

    End Sub 
End Class 

我我们试图在这个语句中进行更改,如使用不同的参数方法......但所有的代码都显示了相同的错误。

+0

我敢打赌,问题是,你正在使用的输入中有一个参数占位符。因此,你面临的问题是你的代码对于SQL注入来说是非常开放的。您需要使用SQL参数将用户输入视为* data *,而不是视为***可执行代码***。 – David

回答

1

在查询结束时,您不提供用户名正确。但这不是唯一的问题。让我编辑的代码位:

Using dbcon As New OleDbConnection(cString) 
    dbcon.Open() 

    Using dbcmd As New OleDbCommand(
     "UPDATE login1 SET height = @height WHERE username = @username", 
     dbcon) 
     dbcmd.Parameters.AddWithValue("@height", TextBox2.Text) 
     dbcmd.Parameters.AddWithValue("@username", str) 

     dbcmd.ExecuteNonQuery() 
    End Using 
End Using 

注:using语句,以确保对象是布置财产也,不共享连接。当你需要连接时,建立它,打开它,使用它,然后处理它。

+0

虽然不完全错误,但在此上下文中不鼓励使用* named *参数,因为ACE.OLEDB实际上忽略了名称并仅依赖于参数的*顺序*。 'SET height =?在哪里用户名=?'是首选。 –

+0

@GordThompson,非常有趣的一点和很好的补充 - 非常感谢! –

2

使用参数化查询肯定是要走的路,但使用命名参数应在这方面气馁,因为OleDbCommand对象忽略参数名称时CommandTypeText。它们仅依靠订单,其中参数出现在CommandText(参考号:here)中。

因此,最好的办法是

Using dbcmd As New OleDbCommand(
      "UPDATE login1 SET height=? WHERE username=?", 
      dbcon) 
    dbcmd.Parameters.AddWithValue("?", TextBox2.Text) ' height 
    dbcmd.Parameters.AddWithValue("?", str) ' username 
    dbcmd.ExecuteNonQuery() 
End Using