2011-03-11 216 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注入攻擊。