2012-03-14 145 views
3

我正在研究一個允許列出電影的應用程序,以及編輯,插入和刪除它們。在分貝我有三個表(電影,流派和MovieGenre),這個問題是關係到添加一個流派到電影(通過添加到表MovieGenre,它保持電影流派的軌道)。指定的參數太多

下面是相關的代碼以及拋出的異常。我只是無法弄清楚爲什麼我會得到這個錯誤消息,因爲我使用了正確數量的參數,因爲我可以在調用sproc時在c#代碼中看到它。

有人可以看到這裏有什麼問題嗎?

例外: 過程或函數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'不是一個參數。 – 2012-03-14 10:13:08

+0

商店程序中@MovieGenreID的定義在哪裏? – 2012-03-14 10:13:46

回答

7

錯誤becaue此行

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

解決修改存儲procdeurre

存儲過程:

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 2012-03-14 10:28:52

+0

請注意,「@@ identity」和「SCOPE_IDENTITY」存在很大差異:http://www.codeproject.com/Articles/103610/Difference-between-IDENTITY-SCOPE_IDENTITY-IDENT_C但在這種情況下應該沒有什麼區別(希望)。 – 2012-03-14 10:32:13

1

刪除此行。您的Sproc只需要前兩個參數

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

編輯:獲取創建的ID您可以使用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