.NET Core的Dapper:插入表并返回插入行的id

时间:2018-06-01 21:05:37

标签: asp.net-core dapper

我的存储库中有以下方法。截至目前,我认为返回的int只是表明操作是否成功的一个。我希望int成为执行成功后返回的id(表的单列)。我该如何做到这一点?

    public async Task<int> AddNewGroup()
    {
        using(_connection)
        {
            _connection.Open();
            var id = await _connection.ExecuteAsync("INSERT INTO groups").Single();
        }
    }

4 个答案:

答案 0 :(得分:4)

您可以运行包含2部分的查询,第一部分是 INSERT 部分,第二部分是 SELECT 部分。在SELECT部分​​中,您可以返回(选择)您想要的任何列值。

例如,如果您的组表有一个名为GroupId的主键列,并且您已将该列设置为标识值生成(自动值生成),则可以调用SCOPE_IDENTITY()来生成值。

我们将使用QueryAsync方法。

public async Task<int> AddNewGroup()
{
   using(_connection)
   {
      _connection.Open();
      var q = @"INSERT INTO Groups(Name,Description) VALUES
                 (@name, @desc); SELECT CAST(SCOPE_IDENTITY() as int)"
      var result = await _connection.QueryAsync<int>(q, 
                                          new { @name="some name", @desc="some desc"});
      return result.Single();
   }
}

答案 1 :(得分:2)

    public static void Main()
    {
        string sql = @"INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) 
        Values (@CustomerName, @ContactName, @Address, @City, @PostalCode, @Country);
        SELECT CustomerID FROM Customers WHERE CustomerID = SCOPE_IDENTITY();";

        using (var connection = new SqlConnection(GetConnectionString()))
        {
            Customer c = new Customer("Brian Adams", "Brian", "12 Jones Place", "New York", "NY12", "CA");
                            
            var id = connection.QueryFirstOrDefault<int>(sql, c);
            
            Console.WriteLine("The Customer ID is " + id);
            sql = "Select * FROM CUSTOMERS WHERE CustomerID = @ID";
            
            var rc = connection.QueryFirstOrDefault<Customer>(sql, new{ @ID = id });
        }
    }
}

答案 2 :(得分:1)

您不必手动创建插入查询,您可以使用Dapper.Contrib github来帮助您管理CRUD操作。

使用Dapper.Contrib可以执行以下操作:

 public async Task<int> AddNewGroup(Group entity)
 {
        using (_connection)
        {
             _connection.Open();
             var id = await _connection.InsertAsync(entity);
         }
 }

答案 3 :(得分:0)

如果您正在使用SQL Azure / SQL Server,则需要使用类似

的内容从查询中返回插入的值
INSERT INTO groups OUTPUT inserted.id VALUES (...)

然后使用ExecuteAsync使用ExecuteScalarAsync

此处引用OUTPUT子句: https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017