SQLException: в процедуре или функции sqQuestion_AddNewQuestion указано слишком много аргументов

#c# #sql #asp.net-core #stored-procedures

#c# #sql #asp.net-core #хранимые процедуры

Вопрос:

Я пытаюсь ввести некоторые данные в локальную базу данных SQL Server. Однако, несмотря на многократный подсчет количества параметров, я все равно получаю эту ошибку:

У процедуры или функции sqQuestion_AddNewQuestion указано слишком много аргументов

Проблема возникает в SqlDataAccess.SaveDataInTransaction . Многие другие вопросы по этому поводу связаны с циклом foreach, вызывающим проблему, однако я его не использую.

Я новичок в C #, поэтому, возможно, я упускаю очевидное.

Код выглядит следующим образом:

dbo.Вопросы:

 CREATE TABLE [dbo].[Questions]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
    [Topic] NVARCHAR(50) NOT NULL, 
    [Title] NVARCHAR(50) NOT NULL, 
    [Description] NVARCHAR(200) NOT NULL, 
    [AuthorId] NVARCHAR(128) NOT NULL, 
    [Image] NVARCHAR(MAX) NULL, 
    [CreatedDate] DATETIME2 NOT NULL DEFAULT getutcdate()
)
  

Хранимая процедура:

 CREATE PROCEDURE [dbo].[sqQuestion_AddNewQuestion]
    @Topic nvarchar(50),
    @Title nvarchar(50),
    @Description nvarchar(200),
    @AuthorId nvarchar(128),
    @CreatedDate datetime2,
    @Image nvarchar(Max)
AS
BEGIN
    SET NOCOUNT ON

    INSERT INTO dbo.Questions(Topic, Title, [Description], AuthorId, CreatedDate, [Image])
    VALUES (@Topic, @Title, @Description, @AuthorId, @CreatedDate, @Image)
END
  

QuestionDbModel:

 public class QuestionDbModel
{
    public int Id { get; set; }
    public string Topic { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }
    public string AuthorId { get; set; }
    public DateTime CreatedDate { get; set; }
    public List<CommentModel> Comments { get; set; }
}
  

QuestionModel (используется для разрешения пользователям загружать изображения):

 public class QuestionModel
{
    public int Id { get; set; }
    public string Topic { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    [DisplayName("Image")]
    public string Image { get; set; }
    [NotMapped]
    [DisplayName("Upload Image")]
    public IFormFile ImageFile { get; set; }
    public string AuthorId { get; set; }
    public DateTime CreatedDate { get; set; }
    public List<CommentModel> Comments { get; set; }
}
  

Контроллер панели мониторинга:

 [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(QuestionModel question)
{
    var wwwRootPath = _hostEnvironment.WebRootPath;

    string file = Path.GetFileNameWithoutExtension(question.ImageFile.FileName);
    string ext = Path.GetExtension(question.ImageFile.FileName);
    string fileName = DateTime.Now.ToString("yymmssfff")   ext;

    var path = Path.Combine(wwwRootPath   "/QuestionImages/", fileName);

    using (var filestream = new FileStream(path, FileMode.Create))
    {
        question.ImageFile.CopyToAsync(filestream);
    }

    QuestionDbModel newQuestion = new QuestionDbModel
        {
            Topic = question.Topic,
            Title = question.Title,
            Description = question.Description,
            Image = fileName,
            AuthorId = question.AuthorId,
            CreatedDate = question.CreatedDate
        };

    try
    {
        _sqlDataAccess.StartTransaction("*DAtabaseName*");

        _sqlDataAccess.SaveDataInTransaction("dbo.sqQuestion_AddNewQuestion", newQuestion);

        _sqlDataAccess.CommitTransaction();

        return RedirectToAction(nameof(Index));
    }
    catch
    {
        _sqlDataAccess.RollbackTransation();
        throw;
    }
}
  

SqlDataAccess (SaveDataInTransaction):

 public void SaveDataInTransaction<T>(string storedProcedure, T parameters)
{
    _connection.Execute(storedProcedure, parameters,
                        commandType: CommandType.StoredProcedure, transaction: _transaction);
}
  

Ответ №1:

Класс «QuestionDbModel» не соответствует списку ожидаемых параметров. В качестве теста попробуйте создать другой класс, который имеет только те свойства, которые соответствуют списку параметров, ожидаемых хранимой процедурой. Если это решит проблему, вы можете решить использовать наследование или интерфейс, который поддерживается классом QuestionDbModel, но предоставляет только 6 свойств / параметров.

Комментарии:

1. Я удалил комментарии List<CommentModel> и свойства Id, и это сработало отлично. Большое вам спасибо за вашу помощь. 😀