【发布时间】:2019-03-11 19:03:00
【问题描述】:
我遇到了以下代码的问题,无法弄清楚它有什么问题:
存储过程:
CREATE PROCEDURE [dbo].[spAddRateTypeRoomTypeCombination]
(
@RatePlanName NVARCHAR(50),
@OpenFrom DATE,
@OpenTo DATE,
@Active BIT,
@RoomTypeId INT)
AS
DECLARE @Result INT
BEGIN TRANSACTION
IF EXISTS (SELECT NULL FROM dbo.RateType WITH (UPDLOCK)
WHERE RatePlanName = @RatePlanName)
BEGIN
SELECT @Result = -1
END
ELSE
BEGIN
INSERT INTO dbo.RateType (RatePlanName, OpenFrom, OpenTo, Active)
VALUES (@RatePlanName, @OpenFrom, @OpenTo, @Active)
/****** return the last identity value inserted into an identity column ******/
DECLARE @RateTypeid INT
SET @RateTypeId = SCOPE_IDENTITY()
INSERT INTO dbo.RateRoomCombination(RateTypeId, RoomTypeId)
VALUES (@RateTypeId, @RoomTypeId)
SELECT @Result = @@ERROR
END
IF @Result <> 0
BEGIN
ROLLBACK
END
ELSE
BEGIN
COMMIT
END
RETURN @Result
GO
这是我为了将数据插入到我的 2 个表 RateType 和 RateRoomCombination 中而编写的函数:
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
我得到的错误:
System.Exception: '插入错误:过程或函数 spAddRateTypeRoomTypeCombination 指定了太多参数。'
如果我使用 1 个 RateTypeId 和 1 个 RoomTypeId 从 SQL 执行我的存储过程,我的数据库就会更新。如果我添加超过 1 个 RoomTypeId(我试图在我的页面上执行的情况),SQL 会抛出与上述相同的错误:参数过多。
我真的不知道哪里出了问题。
谢谢
【问题讨论】:
-
直接执行时运行的是什么命令?向存储过程传递太多参数应该总是抛出同样的错误消息。
-
我执行 DB] GO EXEC dbo.spAddRateTypeAndRoomtareCombination_UsingExists @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 个参数,仅此而已。你不能随意在调用中添加参数——它不是那样工作的。你需要做一些事情,比如建立一个列表,然后在存储过程中拆分它,或者创建一个用户定义的表类型,然后传递你的值。
标签: sql-server stored-procedures ado.net