【问题标题】:SqlException: Incorrect syntax near @VariableName in asp.net mvc coreSqlException:asp.net mvc 核心中@VariableName 附近的语法不正确
【发布时间】:2020-04-30 11:24:22
【问题描述】:

我正在尝试将数据(实际上是视频)插入数据库在 ASP.NET MVC 核心中使用 MS SQL 中的存储过程

我有这个代码:

    [HttpPost]
    public async Task<IActionResult> Index(string title, IFormFile file, string filesize ,string filePath )
    {
        var Title= new SqlParameter("@Title", title);
        var UploadType = new SqlParameter("@UploadType", file.ToString());
        var FileSize = new SqlParameter("@FileSize", filesize);
        var FilePath = new SqlParameter("@FilePath", filePath);


        var insertVideo = _context.Lectures.FromSql("usp_AddNewVideoFile (@Title,@UploadType, @FileSize, @FilePath) ",parameters:new[] {Title,FileSize,FilePath,UploadType }).ToList();
        await _context.SaveChangesAsync();

        return RedirectToAction("Source",insertVideo);
    }

存储过程:

CREATE procedure [dbo].[usp_AddNewVideoFile]

@Title nvarchar(50),  
@UploadType nvarchar(50),
@FileSize int = null,  
@FilePath nvarchar(MAX)

as  
begin  

insert into Lectures(Name,FileSize,FilePath,UploadType)   
values (@Title,@FileSize,@FilePath,@UploadType)   

end 

得到一个错误说:

SqlException:“@Title”附近的语法不正确。

可能是什么原因?

【问题讨论】:

    标签: c# sql-server model-view-controller asp.net-core-mvc


    【解决方案1】:

    如下改变:

    [HttpPost]
    public async Task<IActionResult> Test(string title, IFormFile file, int filesize, string filePath)
    {
        var Title = new SqlParameter("@Title", title);
        var UploadType = new SqlParameter("@UploadType", file.ToString());
        var FileSize = new SqlParameter("@FileSize", filesize);
        var FilePath = new SqlParameter("@FilePath", filePath);
    
        //change this...    
        var insertVideo = _context.Database.ExecuteSqlCommandAsync("usp_AddNewVideoFile @Title,@UploadType,@FileSize, @FilePath", parameters: new[] { Title, UploadType, FileSize, FilePath });
    
        await _context.SaveChangesAsync();
    
        return RedirectToAction("Source", insertVideo);
    }
    

    【讨论】:

    • 您的更改确实显示了一些效果。解决了我最大的错误。非常感谢! :)
    【解决方案2】:

    问题出在这里:

    usp_AddNewVideoFile (@Title,@UploadType, @FileSize, @FilePath)
    

    这不是你所说的SP; 理想的方式是将命令类型指定为CommandType.StoredProcedure,并将"usp_AddNewVideoFile"指定为CommandText。如果由于FromSql 而无法实现,那么:

    EXEC usp_AddNewVideoFile @Title,@UploadType, @FileSize, @FilePath;
    

    但是请注意,如果这是 EF FromSql,那么将其用于插入命令可能并不理想;您确实在寻找“执行非查询”API。

    【讨论】:

      【解决方案3】:

      请检查:

          [HttpPost]
          public async Task<IActionResult> Index(string title, IFormFile file, string filesize ,string filePath )
          {
              var Title= new SqlParameter("@Title", title);
              var UploadType = new SqlParameter("@UploadType", file.ToString());
              var FileSize = new SqlParameter("@FileSize", filesize);
              var FilePath = new SqlParameter("@FilePath", filePath);
      
      
              var insertVideo = _context.Lectures.FromSqlRaw("EXECUTE usp_AddNewVideoFile @Title, @FilePath, @FilePath, @UploadType", parameters:new[] {Title,FileSize,FilePath,UploadType }).ToList();
              await _context.SaveChangesAsync();
      
              return RedirectToAction("Source",insertVideo);
          }
      

      【讨论】:

      • 现在应该没问题了。请检查一下。
      • 但是你刚才写的这里是我写的。我看不出有什么区别?这只是您删除的支架。无论如何,让我检查一下。
      • 括号。请检查此link
      • 现在它给了我不同的错误提示:'ArgumentException: No mapping exists from object type Microsoft.AspNetCore.Http.Internal.FormFile to an known managed provider native type'
      • 好的,我改成FromSqlRaw并添加了execute
      猜你喜欢
      • 1970-01-01
      • 2015-12-12
      • 2013-12-16
      • 1970-01-01
      • 2018-08-14
      • 2011-03-11
      • 2014-02-16
      • 2017-01-11
      • 2020-02-06
      相关资源
      最近更新 更多