0

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

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()

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

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

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

4

2 回答 2

1

当您在Repeater 中搜索控件时,您应该考虑在Repeater 控件中显示了多少ItemsTemplate。

FindControl方法_

在当前命名容器中搜索具有指定 id 参数的服务器控件

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

所以你得到的代码lblPostID应该如下

Dim PostId As Label = DirectCast(Repeater1.Items(0).FindControl("lblPostId"), Label)
于 2013-02-22T08:51:38.890 回答
0
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()
于 2013-02-22T07:30:54.703 回答