初始化存储过程中的参数

时间:2016-03-21 14:28:04

标签: c# sql tsql stored-procedures

执行存储过程时出现异常:

  

过程或函数'spAddItemByUrl'需要参数'@userId',这是未提供的。

但是我已经初步化了,所以我错了什么?

这是存储过程:

create proc spAddItemByUrl
    @title nvarchar(50),
    @body nvarchar(50),
    @link nvarchar(50),
    @userName nvarchar(50),
    @url nvarchar(50),
    @userId int,
    @feedId int
as
begin
    insert into feed(title, body, link) values(@title, @body, @link)
    select @userId = id from users where name = @userName
    select @feedId = id from feed where title = @title
    insert into userstofeed(userid, feedid) values(@userId, @feedId) 
    insert into feedurl(url, feedid, userid) values(@url, @feedId, @userId)
end

这是C#代码。 当我拨打ExecuteNonQuery时会抛出异常:

connection.SqlCommand.Parameters.AddWithValue("@url", urlFeed.Url);
connection.SqlCommand.Parameters.AddWithValue("@title", item.Title.Text);
connection.SqlCommand.Parameters.AddWithValue("@body", item.Summary.Text);
connection.SqlCommand.Parameters.AddWithValue("@link", item.Id);
connection.SqlCommand.Parameters.AddWithValue("@userName", user);
connection.SqlCommand.ExecuteNonQuery();
connection.SqlCommand.Parameters.Clear();

3 个答案:

答案 0 :(得分:2)

您已将@userId int, @feedId int添加到SProc的参数列表中,但从查询中看起来您不希望用户提供它们。您可以在SProc中声明它们以使它们成为“本地”。

create proc spAddItemByUrl
    @title nvarchar(50),
    @body nvarchar(50),
    @link nvarchar(50),
    @userName nvarchar(50),
    @url nvarchar(50)
as
begin
    DECLARE @userId int, @feedId int;

    insert into feed(title, body, link) values(@title, @body, @link)
    select @userId = id from users where name = @userName
    select @feedId = id from feed where title = @title
    insert into userstofeed(userid, feedid) values(@userId, @feedId) 
    insert into feedurl(url, feedid, userid) values(@url, @feedId, @userId)
end

答案 1 :(得分:1)

您已指定

connection.SqlCommand.Parameters.AddWithValue("@userName", user);

但不是@userid

答案 2 :(得分:1)

如果要将默认值添加到存储过程参数,可以执行以下操作:

create proc spAddItemByUrl
...
@userId int = 0, /* or whatever you want the default value to be */
@feedId int = 0

如果您决定调用存储过程,则只需传递代码中提供的五个参数,值@userId@feedId将为0.如果您决定指定值对于调用函数中的这两个参数,将使用您传递的值。

由于您的存储过程不使用这些参数,因此您应该从它们所在的部分中删除它们。

而只是做

declare @userId int = select id from users where name = @userName
declare @feedId int = select id from feed where title = @title