2012-03-14 2 views
3

Я работаю над приложением, которое позволяет перечислить фильмы, а также редактировать, вставлять и удалять их. В db у меня есть три таблицы (Movie, Genre и MovieGenre), и эта проблема связана с добавлением жанра в фильм (добавив в таблицу MovieGenre, в котором хранятся треки жанров фильмов).Слишком много аргументов

Ниже приведен соответствующий код, а также исключение. Я просто не могу понять, почему я получаю это сообщение об ошибке, потому что я использую правильное количество аргументов, поскольку я могу видеть это в коде C# при вызове sproc.

Может кто-нибудь увидеть, в чем проблема?

Исключение: Процедура или функция usp_InsertMovieGenre содержит слишком много аргументов.

Сведения об исключении: System.Data.SqlClient.SqlException: Процедура или функция usp_InsertMovieGenre содержит слишком много аргументов.

C# код:

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 
+0

'@ MovieGenreID' не является параметром. –

+0

Где определение @MovieGenreID в вашей процедуре магазина? –

ответ

7

Ошибка Becaue этой линии

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

разрешить модифицируют хранится procdeurre

sproc:

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 
+0

Решил мою проблему, спасибо! – holyredbeard

+0

Обратите внимание, что это большая разница в '@@ identity' и' SCOPE_IDENTITY': http://www.codeproject.com/Articles/103610/Difference-between-IDENTITY-SCOPE_IDENTITY-IDENT_C. Но в этом случае не должно быть никакого значения (с надеждой). –

1

Удалить эту строку. Ваш Sproc принимает только первые два параметра

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

редактировать: чтобы получить идентификатор созданного вы можете использовать NewID() я считаю. Который выглядит твоей целью.

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 
Смежные вопросы