我的存储库中有以下方法。截至目前,我认为返回的int只是表明操作是否成功的一个。我希望int成为执行成功后返回的id(表的单列)。我该如何做到这一点?
public async Task<int> AddNewGroup()
{
using(_connection)
{
_connection.Open();
var id = await _connection.ExecuteAsync("INSERT INTO groups").Single();
}
}
答案 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