我写了以下存储过程: 其中有2个表艺术和艺术家.artistId是艺术表中的外键。
create procedure spInsertArts(
@artsId int out,
@name varchar(50),
@category varchar(50),
@artistId int
)
as
begin
declare @artistId int
set @artistId=@@IDENTITY
if exists(select artistId from artist)
insert into arts(name,category,artistId) values(@name,@category,@artistId)
end
我收到的错误是:
过程或函数spInsertArts指定了太多参数。
用于调用此过程的代码是:
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@name", TextBox1.Text);
cmd.Parameters.AddWithValue("@category", DropDownList1.SelectedValue);
SqlParameter output = new SqlParameter();
output.ParameterName = "@artsId";
output.SqlDbType = System.Data.SqlDbType.Int;
output.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(output);
con.Open();
cmd.ExecuteNonQuery();
请帮助
答案 0 :(得分:0)
您没有为参数@artistId
传递任何值
传递值或更改过程并将其设置为默认值null,请参见下文:
cmd.Parameters.AddWithValue("@artistId", "VALUE_HERE");
OR
create procedure spInsertArts(
@artsId int out,
@name varchar(50),
@category varchar(50),
@artistId int = null
)
答案 1 :(得分:0)
output.ParameterName = "@artsId";
您使用的"@artsId"
应该是"@artistId"
答案 2 :(得分:0)
根据您的评论,您希望使用艺术家表中最后插入的记录,您想要使用:
DECLARE @artistId INT = IDENT_CURRENT('dbo.Artist');
或者只是
DECLARE @artistId INT = (SELECT MAX(ArtistID) FROM dbo.Artist);
CREATE PROCEDURE dbo.spInsertArts
@name VARCHAR(50),
@category VARCHAR(50),
@artsId INT OUT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (SELECT 1 FROM dbo.Artist)
BEGIN
DECLARE @artistId INT = (SELECT MAX(ArtistID) FROM dbo.Artist);
INSERT dbo.Arts (Name, Category, ArtistID)
VALUES (@Name, @Category, @ArtistID);
SET @ArtsID = SCOPE_IDENTITY();
END
END
我对您的代码进行了以下更改:
Aaron Bertrand写了一篇名为My stored procedure "best practices" checklist的好文章,我倾向于坚持,虽然其中一些是个人偏好,但对我来说这一切都是合乎逻辑的。
我真的不同意这种逻辑,它会使你的程序完全不灵活。如果您需要为不是最新艺术家的艺术家插入艺术品,该怎么办?如果插入最后一位艺术家是一个真正的要求,那么我建议有两个程序:
CREATE PROCEDURE dbo.spInsertArts
@name VARCHAR(50),
@category VARCHAR(50),
@ArtistID INT,
@artsId INT OUT
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.Arts (Name, Category, ArtistID)
VALUES (@Name, @Category, @ArtistID);
END
GO
CREATE PROCEDURE dbo.spInsertArtsWithLatestArtist
@name VARCHAR(50),
@category VARCHAR(50),
@artsId INT OUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @artistId INT = (SELECT MAX(ArtistID) FROM dbo.Artist);
IF @ArtistID IS NOT NULL
BEGIN
EXECUTE dbo.spInsertArts @name, @category, @ArtistID, @artsID OUT;
END
END