Asp.net 这个代码有什么问题?

Asp.net 这个代码有什么问题?,asp.net,vb.net,visual-studio-2008,sqldatasource,Asp.net,Vb.net,Visual Studio 2008,Sqldatasource,我已经编辑了这篇文章,但同样的问题是: Protected Sub SqlDataSource1_Updated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Updated For Each myRow As GridViewRow In GridView1.Rows 'Find the c

我已经编辑了这篇文章,但同样的问题是:

Protected Sub SqlDataSource1_Updated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Updated
    For Each myRow As GridViewRow In GridView1.Rows
        'Find the checkbox
        Dim lab1 As Label = DirectCast(myRow.FindControl("Label1"), Label)
        Dim lab4 As Label = DirectCast(myRow.FindControl("Label4"), Label)
        Try
            Using conn = New SqlConnection(constr)
                Using cmd = conn.CreateCommand()
                    conn.Open()
                    Dim sql As String = "UPDATE a1_ticket SET Travels = @travels WHERE travelid = @travelid"
                    cmd.CommandText = sql
                    cmd.Parameters.AddWithValue("@travels", lab4.Text)
                    cmd.Parameters.AddWithValue("@travelid", lab1.Text)
                    cmd.ExecuteNonQuery()
                End Using
            End Using
        Catch ex As Exception
            Response.Write(ex.Message)
        End Try
    Next
End Sub

错误:对象引用未设置为对象的实例

错误在此行:
Dim strSql As String=“UPDATE a1_ticket SET Travels=”&lab4.Text&“WHERE travelid=“&lab1.Text

travelid is Text so it should be travelid='" & lab4.Text & "'".

我强烈怀疑这将是罪魁祸首:

Dim lab1 As Label = DirectCast(myRow.FindControl("Label1"), Label)
Dim lab4 As Label = DirectCast(myRow.FindControl("Label4"), Label)
FindControl
如果找不到具有该ID的控件,则返回null/Nothing。我的猜测是,因为您可能有多行,所以每行中控件的ID都会自动生成,并带有额外的信息。我建议您查看页面上的HTML,看看生成了什么。。。您可能希望寻找一种更好的方法来查找行中的单个控件


如注释中所述,您应该参数化您的SQL语句以避免SQL注入攻击。

您到底得到了哪一行异常?最有可能的标签变量之一——lab1和/或lab2为空。使用调试器,设置断点并自己检查。你能指出错误行吗。是在您强制转换标签时吗?当您修复了NullReferenceException后,下一个调用端口将是SQL注入攻击漏洞。。。使用参数化查询,而不是将值连接到SQL中。您如何知道travelid的类型?它可以是一个整数字段。SQL更大的问题是它没有参数化。。。但即便如此,我不认为这是报告错误的原因。异常会谈论无效的SQL或类似的内容,而不是NullReferenceException。@Jon因为lab4.Text是字符串,所以它将是字符串,或者需要在整数或其他内容中进行类型转换。否,因为它正在生成字符串-SQL语句。当然,当前代码没有执行任何验证
lab4.Text
实际上是一个有效的整数,但是如果它是(如果
travelid
是一个整数字段),那么它就是一个有效的SQL语句。没有理由认为引号是这里的解决方案。@Jon,你说得对。我假设该字段为字符串,因为在该字段上指定了字符串。