我正在开发一个应用程序,它允许人们列出电影以及编辑,插入和删除它们。在db中我有三个表(Movie,Genre和MovieGenre),这个问题与向电影添加一个类型有关(通过添加到MovieGenre表,它保存了电影类型的轨迹)。
下面是相关代码,以及抛出的异常。我只是无法弄清楚为什么我会收到此错误消息,因为我使用正确数量的参数,因为我可以在调用sproc时在c#代码中看到它。
有人可以看到这里有什么问题吗?
异常: 过程或函数usp_InsertMovieGenre指定了太多参数。
异常详细信息: System.Data.SqlClient.SqlException:过程或函数usp_InsertMovieGenre指定了太多参数。
c#code:
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 :(得分: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()。这看起来是你的意图。