Sql server 存储过程中的过程或函数指定的参数太多

Sql server 存储过程中的过程或函数指定的参数太多,sql-server,stored-procedures,ado.net,Sql Server,Stored Procedures,Ado.net,我遇到以下代码主题的问题,无法找出问题所在: 存储过程: 我得到的错误是: System.Exception:“插入错误:过程或函数spAddRateTypeRoomTypeCombination指定的参数太多。” 如果我使用1个RateTypeId和1个RoomTypeId从SQL执行存储过程,我的数据库将得到更新。如果我在我的页面上添加了超过1个RoomTypeId,那么SQL会抛出与上面相同的错误:参数太多 我真的搞不清楚出了什么问题 感谢您的错误,这里有两个原因: For Eac

我遇到以下代码主题的问题,无法找出问题所在:

存储过程:

我得到的错误是:

System.Exception:“插入错误:过程或函数spAddRateTypeRoomTypeCombination指定的参数太多。”

如果我使用1个RateTypeId和1个RoomTypeId从SQL执行存储过程,我的数据库将得到更新。如果我在我的页面上添加了超过1个RoomTypeId,那么SQL会抛出与上面相同的错误:参数太多

我真的搞不清楚出了什么问题


感谢您的错误,这里有两个原因:

    For Each item As ListItem In chkRoomTypes.Items
        cmd.Parameters.Add(New SqlParameter("@RateTypeId", SqlDbType.Int))
        cmd.Parameters.Add(New SqlParameter("@RoomTypeId", SqlDbType.Int))
    Next
您的存储过程甚至没有@RateTypeId参数,而是有一个同名的局部变量。因此,无法在.net命令中向其传递参数

存储过程中的@RoomTypeId参数的类型为INT。这意味着您只能向它传递一个INT值。无法将多个@RoomTypeId参数添加到.net命令并将其传递到此存储过程。如果您想这样做,您应该考虑将其作为表值参数


当您直接执行它时,您正在运行什么命令?向存储过程传递太多参数时,始终会抛出相同的错误消息。我使用exists@RatePlanName='Standard',@OpenFrom='2019-03-10T00:00:00',@OpenTo='2019-04-10T00:00:00',@Active=True,@RoomTypeId='5'您的帖子说,当您从SQL执行时,您使用了1个RateTypeId和1个RoomTypeId。该命令中没有指定RateTypeID。在函数中,您试图使用的参数多于存储过程中指定的参数。在存储过程定义中指定了5个参数,这就是它所能做的。你不能随意地在调用中添加参数——它不是那样工作的。您需要创建一个列表,然后将其拆分到存储过程中,或者创建一个用户定义的表类型,并用它传入您的值。您的意思是,每次我需要在多对多/联合表中插入更多tham 1行,就像我尝试做的那样,我总是需要创建一个表值参数?是的,不能向SQL命令添加多个同名参数,因此如果要传递多个RateTypeId,则需要在单个参数中传递所有参数。您可以使用分隔字符串而不是TVP,但是TVP在存储过程代码中更容易处理。非常感谢。最后一个问题:我是否仍然可以使用DECLARE RateTypeid INT SET RateTypeid=SCOPE\u标识来添加RateTypeid?简言之,我需要TVP获取几个房间类型的ID,并获取房间关联的最后一个RateTypeId。是的,您可以这样做,在这种情况下,您根本不会从.net应用程序传递@RateTypeId参数。它在存储过程中严格地说是一个局部变量。嗨@Tab Alleman,我一定会按照你的建议去TVP。我现在正在创建要分配给应用程序代码的参数名称的DataTable。私有函数GetRoomTypeIds As DataTable Dim dt As New DataTable dt.Columns.AddRangeNew DataColumn1{New DataColumnId,GetTypeInteger,New DataColumnRoomTypeId,GetTypeInteger}用于chkRoomTypes中每个li As列表项。Items dt.Rows.AddtxtId1.Text,chkRoomTypes.SelectedValue下一个返回dt End函数
Function AddRateType(RatePlanName As String) As Integer
    Using con As SqlConnection = New SqlConnection(GetConnectionString())
        Dim cmd As New SqlCommand()
        cmd.CommandType = CommandType.StoredProcedure
        cmd.CommandText = "spAddRateTypeRoomTypeCombination"
        cmd.Parameters.Add("@RatePlanName", SqlDbType.NVarChar).Value = TextBoxRateName.Text.Trim()
        cmd.Parameters.Add("@Active", SqlDbType.Bit).Value = CheckBox3.Checked
        cmd.Parameters.AddWithValue("@OpenFrom", Convert.ToDateTime(Textbox1.Text.Trim()))
        cmd.Parameters.AddWithValue("@OpenTo", Convert.ToDateTime(Textbox2.Text.Trim()))
        cmd.Parameters.Add(New SqlParameter("@Result", SqlDbType.Int))
        cmd.Parameters("@Result").Direction = ParameterDirection.ReturnValue
        For Each item As ListItem In chkRoomTypes.Items
            cmd.Parameters.Add(New SqlParameter("@RateTypeId", SqlDbType.Int))
            cmd.Parameters.Add(New SqlParameter("@RoomTypeId", SqlDbType.Int))
        Next
        Dim commandResult As Integer = 1
        cmd.Connection = con
        Try
            con.Open()
            cmd.ExecuteNonQuery()
            commandResult = CType(cmd.Parameters("@Result").Value, Integer)
        Catch ex As System.Data.SqlClient.SqlException
            commandResult = ex.Number
            ' Use the following 3 lines to understand better the error
            Dim msg As String = "Insert Error:"
            msg += ex.Message
            Throw New Exception(msg)
        Finally
            con.Close()
            con.Dispose()
        End Try
        Return commandResult
    End Using
End Function
    For Each item As ListItem In chkRoomTypes.Items
        cmd.Parameters.Add(New SqlParameter("@RateTypeId", SqlDbType.Int))
        cmd.Parameters.Add(New SqlParameter("@RoomTypeId", SqlDbType.Int))
    Next