2011-03-11 137 views
0

我已经编辑这一点,但同样的问题:这段代码有什么问题?

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 

ERROR: OBJECT引用不是设置为一个对象

+2

你会得到什么样的例外?很可能你的一个标签变量 - lab1和/或lab2是空的。使用调试器,放置断点并检查自己。 – 2011-03-11 06:17:25

+0

你能指出错误吗?是否当你投标签? – 2011-03-11 06:19:41

+0

修复NullReferenceException时,下一个端口将成为SQL注入攻击漏洞......使用参数化查询而不是将值连接到SQL中。 – 2011-03-11 06:27:36

回答

1

错误是在这条线的INSTANCE: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 & "'". 
+0

你怎么知道travelid的类型?它可能是一个整数字段。 SQL的更大问题是它没有参数化......但即使如此,我认为这不是导致报告错误的原因。这个异常会讨论无效的SQL或类似的东西,而不是NullReferenceException。 – 2011-03-11 06:31:45

+0

@Jon因为lab4.Text是字符串,所以它将是字符串或需要在整数或其他类型中进行类型转换。 – Sandy 2011-03-11 06:33:18

+0

不,因为它是*构建*一个字符串 - 一条SQL语句。当然,当前代码没有执行任何验证,即lab4.Text实际上是一个有效的整数,但如果它是(并且如果travelid是整数字段),那么它是一个有效的SQL语句。没有理由认为报价是解决方案。 – 2011-03-11 07:03:20

1

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

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注入攻击。