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