如何在ASP.NET Core 3.0中的存储过程中添加参数

问题描述

我有这个存储过程:

CREATE PROCEDURE AddReserv
    @Place int,@StartDate datetime,@EndDate datetime
AS
BEGIN
    INSERT INTO [dbo].Reserv(UserId,Place,StartDate,EndDate)
    VALUES (1,@Place,@StartDate,@EndDate)
END

从post方法的控制器中,我想向表中添加新记录。我不知道如何将参数传递给存储过程。

我在控制器中的代码:

// POST: api/CreateReserv
[HttpPost]
public void Post(string value)
{
    using (var connection = _db.Database.GetDbConnection())
    {
        connection.Open();

        using (var command = connection.CreateCommand())
        {
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "AddReserv";

            //How to add params?
            /*
                    @Place int
                    @StartDate datetime
                    @EndDate datetime
            */

            command.ExecuteNonQuery();
        }
    }
}

解决方法

您可以使用command.Parameters.Add添加参数,如下所示。

请确保您已安装NuGet软件包System.Data.SqlClient

using (var command = connection.CreateCommand())
{
    command.CommandType = System.Data.CommandType.StoredProcedure;
    command.CommandText = "AddReserv";
    
    command.Parameters.Add("@Place",SqlDbType.Int).Value = place;
    command.Parameters.Add("@StartDate",SqlDbType.DateTime).Value = startDate;
    command.Parameters.Add("@EndDate",SqlDbType.DateTime).Value = endDate;
    
    command.ExecuteNonQuery();     
}
,

用@Karan的一些代码更新了我的答案(应该是正确的答案)

....

  using var connection = _db.Database.GetDbConnection();
  connection.Open();

  using var command = new SqlCommand("AddReserv",connection)
  {
    CommandType = CommandType.StoredProcedure
  };

  command.Parameters.Add("@Place",SqlDbType.Int).Value = place;
  command.Parameters.Add("@StartDate",SqlDbType.DateTime).Value = startDate;
  command.Parameters.Add("@EndDate",SqlDbType.DateTime).Value = endDate;
  
  command.ExecuteNonQuery();

进一步的改进将是使用异步版本的代码。注意:代码编写完成后,如果发布JSON,请不要忘记[FromBody](有关更多信息,请访问https://stackoverflow.com/a/63349923/14072498)。

[HttpPost]
public async Task<IActionResult> Post(string value)
{
  await using var connection = _db.Database.GetDbConnection();
  await connection.OpenAsync();

  await using var command = new SqlCommand("AddReserv",SqlDbType.DateTime).Value = endDate;

  await command.ExecuteNonQueryAsync();

  ....
}

不确定_db是什么类型,如果

_db.Database.GetDbConnection()

有一个异步版本,也要使用它。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...