我有将数据插入数据库的问题。
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变量或未设置的变量。我不知道为什么? 我怎么能解决这个问题?
答案 0 :(得分:2)
在Repeater中搜索控件时,您应该考虑Repeater控件中显示的ItemsTemplate数量。
使用以下命令在当前命名容器中搜索服务器控件 指定的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()