插入数据库时​​未设置对象变量

时间:2013-02-22 07:27:12

标签: asp.net html sql-server vb.net

我有将数据插入数据库的问题。

Dim PostId As Object = DirectCast(Repeater1.FindControl("lblPostId"), Label)

我必须使用Findcontrol,因为页面无法自动找到lblPostId。然后我诽谤 InsertCommand和参数如下:

Dim cmd As SqlCommand = conn.CreateCommand()
        cmd.CommandText = "INSERT INTO [Comments] ([CommentText], [UserName], [PostId]) VALUES (@CommentText, @UserName, @PostId)"
        cmd.Parameters.Add("@PostId", System.Data.SqlDbType.Int).Value = PostId.Text
        cmd.Parameters.Add("UserName", System.Data.SqlDbType.NVarChar).Value = Context.User.Identity.Name
        cmd.Parameters.Add("CommentText", System.Data.SqlDbType.NText).Value = text.Text
        cmd.ExecuteNonQuery()

这是HTML,标签在Repeater内部(由sqldatasource绑定):

<asp:Label ID="lblPostId" runat="server" Text='<%# Eval("PostId") %>' />

但它在PostId参数上返回错误, Object变量或未设置的变量。我不知道为什么? 我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:2)

在Repeater中搜索控件时,您应该考虑Repeater控件中显示的ItemsTemplate数量。

FindControl方法

  

使用以下命令在当前命名容器中搜索服务器控件   指定的id参数

如果您的转发器返回2行数据,那么您在转发器内部有两个“命名容器”,每行一个,它们由Items集合中的单独实例表示。

因此,获取lblPostID的代码应为以下

Dim PostId As Label = DirectCast(Repeater1.Items(0).FindControl("lblPostId"), Label)

答案 1 :(得分:1)

Dim PostId As Object = DirectCast(Repeater1.FindControl("lblPostId"), Label)

应该是

Dim PostId As Label = DirectCast(Repeater1.FindControl("lblPostId"), Label)

并始终按照它们出现的顺序添加参数

Dim cmd As SqlCommand = conn.CreateCommand()
        cmd.CommandText = "INSERT INTO [Comments] ([CommentText], [UserName], [PostId]) VALUES (@CommentText, @UserName, @PostId)"
        cmd.Parameters.Add("@CommentText", System.Data.SqlDbType.NText).Value = text.Text
        cmd.Parameters.Add("@UserName", System.Data.SqlDbType.NVarChar).Value = Context.User.Identity.Name
        cmd.Parameters.Add("@PostId", System.Data.SqlDbType.Int).Value = CInt(PostId.Text)
        cmd.ExecuteNonQuery()