Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 变量名'@用户ID2';已经申报了。变量名在查询批处理或存储过程中必须是唯一的_Vb.net - Fatal编程技术网

Vb.net 变量名'@用户ID2';已经申报了。变量名在查询批处理或存储过程中必须是唯一的

Vb.net 变量名'@用户ID2';已经申报了。变量名在查询批处理或存储过程中必须是唯一的,vb.net,Vb.net,这是我第一次在这里问问题。我正在从事一个项目,在这个项目中,我必须更新一个表,并使用事务将其插入另一个表中 事务块的插入部分将来自所选gridview行的内容 我得到的错误是: 已声明变量名“@userid2”。变量名在查询批处理或存储过程中必须是唯一的 如何解决此错误 这是我的代码: Protected Sub btnmodifyaccessdepot_Click(sender As Object, e As EventArgs) Handles btnmodifyaccessdepot.

这是我第一次在这里问问题。我正在从事一个项目,在这个项目中,我必须更新一个表,并使用事务将其插入另一个表中

事务块的插入部分将来自所选gridview行的内容

我得到的错误是:

已声明变量名“@userid2”。变量名在查询批处理或存储过程中必须是唯一的

如何解决此错误

这是我的代码:

  Protected Sub btnmodifyaccessdepot_Click(sender As Object, e As EventArgs) Handles btnmodifyaccessdepot.Click
        Using con As New SqlConnection(ConString)
            con.Open()
            Dim sqlTran As SqlTransaction = con.BeginTransaction()
            Dim command As SqlCommand = con.CreateCommand()
            command.Transaction = sqlTran

        Try

            command.CommandText = "UPDATE Rhema_TechnicalAccess set Active=@Active,Requester= @Requester,Approver=@Approver,Issuer=@Issuer where userid=@userid"
            command.Parameters.AddWithValue("@Active", lblactiveadd.Text)
            command.Parameters.AddWithValue("@Requester", lblrequesterAdd.Text)
            command.Parameters.AddWithValue("@Approver", lblapproveradd.Text)
            command.Parameters.AddWithValue("@Issuer", lblisssueradd.Text)
            command.Parameters.AddWithValue("@Userid", lblselecteduserid.Text)
            command.ExecuteNonQuery()



            For Each row As GridViewRow In gridadddepot.Rows
                If row.RowType = DataControlRowType.DataRow Then
                    Dim chkdepots As CheckBox = DirectCast(row.FindControl("chkdepots"), CheckBox)
                    If chkdepots.Checked Then
                        Dim lbldepot As TextBox = DirectCast(row.FindControl("lbldepot"), TextBox)



                        command.CommandText = "INSERT INTO Rhema_TechnicalAccessDepot VALUES(@userid2,@Depot,@Access,@TechnicalAccessID)"
                        command.Parameters.AddWithValue("@userid2", lblselecteduserid.Text)
                        command.Parameters.AddWithValue("@Depot", lbldepot.text)
                        command.Parameters.AddWithValue("@Access", lbluseraccessAdd.Text)
                        command.Parameters.AddWithValue("@technicalaccessid", lbltechnicalaccessid.Text)
                    End If
                End If
            Next

            command.ExecuteNonQuery()

            sqlTran.Commit()


            lblmessage2.Text = "Both records were written to database."
        Catch ex As Exception
            lblmessage2.Text = ex.Message

            Try
                sqlTran.Rollback()
            Catch exRollback As Exception
                lblmessage2.Text = exRollback.Message
            End Try
        End Try
    End Using
         End Sub

您应该为每个循环创建
外部的第一个参数,然后在循环内部为其添加值。正如JohnyL所写,您应该在循环之前使用适当的
新SqlParameter
构造函数创建参数,记住声明字符串的大小,并更改循环内部每个参数的.Value。另外,请避免AddWithParameter:像这样的代码是在编写代码时不清楚应该做什么的结果。不仅需要将参数的创建和添加移到循环外部,还需要将
ExecuteNonQuery
调用移到循环内部。每次遍历网格的所有行并更改参数,然后在最后一次更改后只调用
ExecuteNonQuery
一次,这有什么意义?为什么只插入最后一行?更好的选择是用所有数据填充
DataTable
,然后创建一个数据适配器并适当设置其
InsertCommand
。然后,只需调用一次
Update
,即可保存该批次。例如,.@jmcilhinney,请您为我编辑代码,以获得我想要的结果。我是一个迷路的新手。非常感谢你