指定的参数太多

时间:2012-03-14 10:10:59

标签: c# asp.net sql stored-procedures

我正在开发一个应用程序,它允许人们列出电影以及编辑,插入和删除它们。在db中我有三个表(Movie,Genre和MovieGenre),这个问题与向电影添加一个类型有关(通过添加到MovieGenre表,它保存了电影类型的轨迹)。

下面是相关代码,以及抛出的异常。我只是无法弄清楚为什么我会收到此错误消息,因为我使用正确数量的参数,因为我可以在调用sproc时在c#代码中看到它。

有人可以看到这里有什么问题吗?

异常: 过程或函数usp_InsertMovieGenre指定了太多参数。

异常详细信息: System.Data.SqlClient.SqlException:过程或函数usp_InsertMovieGenre指定了太多参数。

c#c​​ode:

public void InsertMovieGenre(MovieGenre movieGenre) {

    using (SqlConnection conn = CreateConnection()) {
        try {
            SqlCommand cmd = new SqlCommand("dbo.usp_InsertMovieGenre", conn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@MovieID", SqlDbType.Int, 4).Value = movieGenre.MovieID;
            cmd.Parameters.Add("@GenreID", SqlDbType.Int, 4).Value = movieGenre.MovieGenreID;

            cmd.Parameters.Add("@MovieGenreID", SqlDbType.Int, 4).Direction = ParameterDirection.Output;

            conn.Open();

            cmd.ExecuteNonQuery();

            movieGenre.MovieID = (int)cmd.Parameters["@MovieGenreID"].Value;
        }
        catch {
        }
    }
}

SPROC:

ALTER PROCEDURE usp_InsertMovieGenre
@GenreID varchar(500),
@MovieID int
AS
BEGIN
    INSERT INTO MovieGenre (GenreID, MovieID)
    VALUES (@GenreID, @MovieID);
END
GO

3 个答案:

答案 0 :(得分:8)

由于此行而出错

cmd.Parameters.Add("@MovieGenreID", SqlDbType.Int, 4).Direction = ParameterDirection.Output; 

解析修改存储过程

存储过程:

ALTER PROCEDURE usp_InsertMovieGenre
    @GenreID varchar(500),
    @MovieID int,
    @MovieGenreID int output

    AS
    BEGIN
        INSERT INTO MovieGenre (GenreID, MovieID)
        VALUES (@GenreID, @MovieID);
     SELECT @MovieGenreID = @@identity   
    END
    GO

答案 1 :(得分:2)

您必须将此输出参数添加到存储过程:

ALTER PROCEDURE usp_InsertMovieGenre
@GenreID varchar(500),
@MovieID int,
@MovieGenreID int OUTPUT
AS
BEGIN
    INSERT INTO MovieGenre (GenreID, MovieID)
    VALUES (@GenreID, @MovieID);
    SELECT @MovieGenreID = SCOPE_IDENTITY();
END
GO

答案 2 :(得分:1)

删除此行。您的Sproc只采用前两个参数

cmd.Parameters
  .Add("@MovieGenreID", SqlDbType.Int, 4)
  .Direction = ParameterDirection.Output;

编辑:要获取创建的ID,我相信你可以使用newId()。这看起来是你的意图。